/ Hex Artifact Content
Login

Artifact 735e0cfc61678f063bc95e12971270206ee61b6c66406d25b3997ad17f823c02:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c60: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5c70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5c80: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5c90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5ca0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5cb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5cd0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5ce0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5cf0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d10: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d20: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d30: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d40: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d50: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d60: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5d70: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5d80: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5d90: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5da0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5db0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5dc0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5dd0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5de0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5df0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e00: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e10: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e40: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e50: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e60: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5e70: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5e80: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ea0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5eb0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ec0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5ed0: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5ee0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5ef0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f00: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f10: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f20: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f30: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f40: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f50: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5f70: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5f80: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5f90: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fa0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fb0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5fc0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5fd0: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
5fe0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
5ff0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6000: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6010: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6020: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6030: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6040: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6050: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6060: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
6070: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
6080: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
6090: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60a0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60b0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60c0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
60d0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
60e0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
60f0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6100: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6110: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6120: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6130: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6140: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6150: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6160: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
6170: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
6180: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
6190: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61b0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61c0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
61d0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
61e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
61f0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6200: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6210: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6220: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6230: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6240: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6250: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6260: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
6270: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
6280: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
6290: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62a0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62b0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62c0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
62d0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
62e0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
62f0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6300: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6310: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6320: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6330: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6340: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6350: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6360: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
6370: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
6380: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
6390: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63a0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63b0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63c0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
63d0: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
63e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
63f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6400: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6410: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6420: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6430: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6440: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6450: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6460: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
6470: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
6480: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
6490: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64a0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64b0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64c0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
64d0: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
64e0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
64f0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6500: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6510: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6520: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6530: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6550: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6560: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
6570: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
6580: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
6590: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65a0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65b0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65c0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
65d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
65e0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
65f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6600: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6610: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6620: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6630: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6640: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6650: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6660: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6670: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6680: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6690: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66a0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66b0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66c0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
66d0: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
66e0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
66f0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6700: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6710: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6720: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6730: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6740: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6750: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6760: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6770: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6780: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6790: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67a0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67b0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67c0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
67d0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
67e0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
67f0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6800: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6810: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6820: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6830: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6840: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6850: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6860: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6870: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6880: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6890: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68a0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68b0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
68d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
68e0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
68f0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6900: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6910: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6920: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6930: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6940: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6970: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6980: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
6990: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69a0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69b0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
69d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
69e0: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
69f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a10: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a20: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a40: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a50: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6a70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6a80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6a90: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6aa0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ab0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6ac0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6ad0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6ae0: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6af0: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b00: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b10: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b20: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b30: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b40: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b50: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b60: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6b70: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6b80: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6b90: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6ba0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6bb0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bc0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6bd0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6be0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6bf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c00: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c10: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c20: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c30: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c50: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c60: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6c70: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6c80: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6c90: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6ca0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6cb0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cc0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6cd0: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6ce0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6cf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d20: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d30: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d40: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d50: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d60: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6d70: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6d80: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6d90: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6da0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6db0: 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b  dRecord(pCur->pK
6dc0: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
6dd0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6df0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
6e00: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
6e10: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
6e20: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
6e30: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
6e40: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
6e50: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
6e60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
6e70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6e80: 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64     goto moveto_d
6e90: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  one;.    }.  }el
6ea0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6eb0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6ec0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6ed0: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6ee0: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6ef0: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76  bias, pRes);.mov
6f00: 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  eto_done:.  if( 
6f10: 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73  pIdxKey ){.    s
6f20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6f30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6f40: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20   pIdxKey);.  }. 
6f50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f60: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6f70: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6f80: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6f90: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6fa0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
6fb0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
6fc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
6fd0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
6fe0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
6ff0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7000: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7010: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7020: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7030: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7040: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7050: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7060: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7070: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
7080: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
7090: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
70a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
70b0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
70c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
70d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
70e0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
70f0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
7100: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
7110: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7120: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
7130: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7140: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
7150: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
7160: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
7170: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
7180: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
7190: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
71a0: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
71b0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
71c0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
71d0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
71e0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
71f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7210: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
7220: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
7230: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
7240: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7250: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
7260: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
7270: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
7280: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
7290: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
72a0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
72b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
72c0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
72d0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
72e0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
72f0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
7300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7310: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
7320: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7330: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7340: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
7350: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
7360: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
7370: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
7380: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
7390: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
73a0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
73b0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
73c0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
73d0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
73e0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
73f0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
7400: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
7410: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
7420: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
7430: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
7440: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
7450: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
7460: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
7470: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
7480: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
7490: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
74a0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
74b0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
74c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
74d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
74e0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
74f0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
7500: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
7510: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
7520: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7530: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
7540: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
7550: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
7560: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
7570: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
7580: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
7590: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
75a0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
75b0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
75c0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
75d0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
75e0: 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20 20  IGNMENT(pCur).  
75f0: 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73 71       || pCur==sq
7600: 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
7610: 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a 20  lidCursor() );. 
7620: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
7630: 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61  f(BtCursor, eSta
7640: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  te)==0 );.  asse
7650: 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  rt( sizeof(pCur-
7660: 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a 20  >eState)==1 );. 
7670: 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f 56   return CURSOR_V
7680: 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70 43  ALID != *(u8*)pC
7690: 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ur;.}../*.** Ret
76a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
76b0: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
76c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
76d0: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
76e0: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
76f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7700: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
7710: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
7720: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
7730: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
7740: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
7750: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
7760: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
7770: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
7780: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
7790: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
77a0: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
77b0: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
77c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
77d0: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
77e0: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
77f0: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
7800: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
7810: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7820: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
7830: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
7840: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
7850: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
7860: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
7870: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
7880: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
7890: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
78a0: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
78b0: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
78c0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
78d0: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
78e0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
78f0: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
7900: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
7910: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
7920: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
7930: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
7940: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
7950: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
7960: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
7970: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
7980: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
7990: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
79a0: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
79b0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
79c0: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
79d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
79e0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
79f0: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
7a00: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
7a10: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
7a20: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
7a30: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7a40: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
7a50: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
7a60: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
7a70: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
7a80: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
7a90: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
7aa0: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
7ab0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7ac0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7ad0: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
7ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7af0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
7b00: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7b10: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
7b20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
7b30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
7b40: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
7b50: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7b60: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
7b70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
7b80: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
7b90: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
7ba0: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bc0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7bd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7be0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7bf0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c00: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c10: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c20: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c30: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7c40: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7c50: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7c60: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7c70: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7c80: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7c90: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7ca0: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7cb0: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7cc0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7cd0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7ce0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7cf0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d00: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d10: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d20: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d30: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7d40: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7d50: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7d60: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7d70: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7d80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7da0: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7db0: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7dc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7dd0: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7de0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7df0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e00: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e10: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e30: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7e40: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7e50: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7e60: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7e70: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7e80: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7e90: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7ea0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7eb0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7ec0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7ed0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7ee0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7ef0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f10: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f20: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f30: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7f40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7f50: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7f60: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7f70: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7f80: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7f90: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7fa0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7fb0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7fc0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
7fd0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
7fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7ff0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8000: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8010: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8020: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8030: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
8040: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
8050: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
8060: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
8070: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
8080: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
8090: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
80a0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
80b0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
80c0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
80d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
80e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
80f0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8100: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8120: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8130: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
8140: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
8150: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
8160: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
8170: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
8180: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8190: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
81a0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
81b0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
81c0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
81d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
81e0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
81f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8200: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8210: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8220: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8230: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
8240: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8250: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8260: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
8270: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
8280: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
8290: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
82a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
82b0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
82c0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
82d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
82e0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
82f0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8300: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8310: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8320: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8330: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
8340: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8350: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
8360: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8370: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
8380: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
8390: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
83a0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
83b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
83d0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
83e0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
83f0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8400: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8410: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8420: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8430: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
8440: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
8450: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
8460: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
8470: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
8480: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
8490: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
84a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
84b0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
84c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
84d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
84e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
84f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8500: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8510: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8530: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
8540: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8550: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
8560: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8570: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
8580: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
8590: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
85a0: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
85b0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
85c0: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
85d0: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
85e0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
85f0: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8600: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8610: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8620: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8630: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8640: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8650: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8660: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
8670: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
8680: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
8690: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
86a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
86b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
86c0: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
86d0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
86e0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
86f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8700: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8710: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8720: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8730: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
8740: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
8750: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
8760: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8770: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
8780: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
8790: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
87a0: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
87b0: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
87c0: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
87d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
87e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
87f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8800: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8810: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8820: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8830: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8840: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
8850: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
8860: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
8870: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8880: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
8890: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
88a0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
88b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
88c0: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
88d0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
88e0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
88f0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8900: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8910: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8920: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8930: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8940: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8950: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8960: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
8970: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
8980: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
8990: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
89a0: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
89b0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
89c0: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
89d0: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
89e0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
89f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a00: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a10: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a20: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a30: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8a40: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8a60: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8a70: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8a90: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8aa0: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8ab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ac0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8ad0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8ae0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8af0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b10: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b20: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b30: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8b40: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8b50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8b60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8b70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8b80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8b90: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8ba0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8bb0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8bc0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8bd0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8be0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c10: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c20: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c30: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8c40: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8c50: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8c60: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8c70: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8c80: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8c90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8ca0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8cb0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8cc0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8cd0: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8ce0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8cf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d00: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d20: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d30: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8d40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8d50: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d60: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8d70: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d80: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8d90: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8da0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8db0: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
8dc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
8dd0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
8de0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
8df0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
8e00: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
8e10: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
8e20: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
8e30: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
8e40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
8e50: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
8e60: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e  ntent..**.** fin
8e70: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64  dCellPastPtr() d
8e80: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63  oes the same exc
8e90: 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73  ept it skips pas
8ea0: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  t the initial.**
8eb0: 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
8ec0: 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69  inter found on i
8ed0: 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69  nterior pages, i
8ee0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
8ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8f00: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
8f10: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
8f20: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
8f30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
8f40: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
8f50: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8f60: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
8f70: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8f80: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8f90: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8fa0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8fb0: 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a  lPastPtr(P,I) \.
8fc0: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73    ((P)->aDataOfs
8fd0: 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  t + ((P)->maskPa
8fe0: 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69  ge & get2byteAli
8ff0: 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c  gned(&(P)->aCell
9000: 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a  Idx[2*(I)])))...
9010: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
9020: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
9030: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
9040: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
9050: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
9060: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
9070: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
9080: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
9090: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
90a0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
90b0: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
90c0: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
90d0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
90e0: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
90f0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
9100: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
9110: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9120: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
9130: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
9140: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9150: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9160: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9170: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9190: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
91a0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
91b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
91c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
91d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
91e0: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
91f0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
9200: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
9210: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9220: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
9230: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
9240: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
9250: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
9260: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
9270: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
9280: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
9290: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
92a0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
92b0: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
92c0: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
92d0: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
92e0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
92f0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
9300: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
9310: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
9320: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
9330: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
9340: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
9350: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
9360: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
9370: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
9380: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
9390: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
93a0: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
93b0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
93c0: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
93d0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
93e0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
93f0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
9400: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
9410: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
9420: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
9430: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
9440: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
9450: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
9460: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
9470: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
9480: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
9490: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
94a0: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
94b0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
94c0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
94d0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
94e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
94f0: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
9500: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
9510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
9520: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
9530: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9540: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
9550: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
9560: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9570: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
9580: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
9590: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
95a0: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
95b0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
95c0: 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  )(&pInfo->pPaylo
95d0: 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  ad[pInfo->nLocal
95e0: 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a  ] - pCell) + 4;.
95f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9600: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
9610: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
9620: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
9630: 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a  ge.xParseCell().
9640: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
9650: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
9660: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
9670: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
9680: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
9690: 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  **.** btreeParse
96a0: 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20  CellPtr()       
96b0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
96c0: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20  e leaf nodes.** 
96d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f  btreeParseCellNo
96e0: 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20  Payload()  =>   
96f0: 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65  table btree inte
9700: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  rnal nodes.** bt
9710: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9720: 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e  ndex()   =>   in
9730: 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a  dex btree nodes.
9740: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
9750: 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75  lso a wrapper fu
9760: 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73  nction btreePars
9770: 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  eCell() that wor
9780: 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65  ks for.** all Me
9790: 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20  mPage types and 
97a0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
97b0: 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65  the cell by inde
97c0: 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a  x rather than.**
97d0: 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a   by pointer..*/.
97e0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
97f0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
9800: 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67  ayload(.  MemPag
9810: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9820: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9830: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9840: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9860: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
9870: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
9880: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9890: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
98a0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
98b0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  /.){.  assert( s
98c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
98d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
98e0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
98f0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
9900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9910: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9920: 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20  e==4 );.#ifndef 
9930: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
9940: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9950: 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pPage);.#endif. 
9960: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9970: 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70  4 + getVarint(&p
9980: 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26  Cell[4], (u64*)&
9990: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
99a0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
99b0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c  = 0;.  pInfo->nL
99c0: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66  ocal = 0;.  pInf
99d0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b  o->pPayload = 0;
99e0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61  .  return;.}.sta
99f0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9a00: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
9a10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9a20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9a30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9a40: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9a60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9a70: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9a80: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9aa0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9ab0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ac0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
9ad0: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
9ae0: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
9af0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
9b00: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
9b10: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
9b20: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
9b30: 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20   */.  u64 iKey; 
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b50: 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76   Extracted Key v
9b60: 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  alue */..  asser
9b70: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9b80: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9b90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9ba0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
9bb0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
9bc0: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
9bd0: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
9be0: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
9bf0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
9c00: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
9c10: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
9c20: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9c30: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9c40: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9c50: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9c60: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
9c70: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
9c80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9c90: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9ca0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9cb0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9cc0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9cd0: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
9ce0: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
9cf0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9d00: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9d10: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9d20: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9d30: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
9d40: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9d50: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9d60: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
9d70: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9d80: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9d90: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9da0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9db0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9dc0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9dd0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9de0: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
9df0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9e00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9e10: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9e20: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9e30: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
9e40: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
9e50: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
9e60: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9e70: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
9e80: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
9e90: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9ea0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9eb0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9ec0: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9ed0: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
9ef0: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
9f00: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
9f10: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
9f20: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
9f30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9f40: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
9f50: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
9f60: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
9f70: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9f80: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
9f90: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9fa0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9fb0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9fc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9fd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
9fe0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9ff0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a000: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
a010: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a020: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
a030: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
a040: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
a050: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
a060: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
a070: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
a080: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
a090: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
a0a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
a0b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
a0c0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a0d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
a0e0: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
a0f0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
a100: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a110: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
a120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
a130: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
a140: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
a150: 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ow(pPage, pCell,
a160: 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73   pInfo);.  }.}.s
a170: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a180: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
a190: 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x(.  MemPage *pP
a1a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
a1b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
a1c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
a1d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
a1e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a1f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
a200: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
a210: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
a220: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
a230: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a240: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
a250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
a260: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a270: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
a280: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
a290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a2a0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
a2b0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
a2c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a2d0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a2e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a2f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a300: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
a310: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
a320: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
a330: 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  tKeyLeaf==0 );. 
a340: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
a350: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a360: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
a370: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a380: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
a390: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
a3a0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
a3b0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
a3c0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a3d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
a3e0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
a3f0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a400: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a410: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
a420: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
a430: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
a440: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
a450: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
a460: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
a470: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a480: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a490: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a4a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a4b0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4c0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a4d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a4e0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a4f0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a500: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a510: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a520: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a530: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a540: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a550: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a560: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a570: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a580: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a590: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a5a0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a5b0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a5c0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a5d0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a5e0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a5f0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a600: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a610: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a620: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a630: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a640: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a650: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a660: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
a670: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a680: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a690: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a6a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
a6b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a6c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
a6d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
a6e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
a6f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
a700: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
a710: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
a720: 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  {.  pPage->xPars
a730: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e  eCell(pPage, fin
a740: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
a750: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
a760: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a770: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
a780: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
a790: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   of the MemPage.
a7a0: 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74  xCellSize.** met
a7b0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75  hod..**.** Compu
a7c0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
a7d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
a7e0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
a7f0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
a800: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
a810: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
a820: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
a830: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
a840: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
a850: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
a860: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
a870: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
a880: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
a890: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
a8a0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
a8b0: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
a8c0: 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74  load()    =>   t
a8d0: 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  able internal no
a8e0: 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  des.** cellSizeP
a8f0: 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20  tr()            
a900: 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20   =>   all index 
a910: 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65  nodes & table le
a920: 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74  af nodes.*/.stat
a930: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
a940: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a950: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a960: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a970: 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll + pPage->chil
a980: 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72  dPtrSize; /* For
a990: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79   looping over by
a9a0: 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a  tes of pCell */.
a9b0: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a9e0: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a9f0: 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69  int */.  u32 nSi
aa00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20    /* Size value 
aa30: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69  to return */..#i
aa40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
aa50: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
aa60: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
aa70: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
aa80: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
aa90: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
aaa0: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
aab0: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
aac0: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
aad0: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
aae0: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
aaf0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
ab00: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
ab10: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
ab20: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
ab30: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
ab40: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
ab50: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
ab60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
ab70: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
ab80: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
ab90: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
aba0: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
abb0: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
abc0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
abd0: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
abe0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
abf0: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
ac00: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
ac10: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
ac20: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ac30: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
ac40: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
ac50: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
ac60: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
ac70: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
ac80: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
ac90: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
aca0: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
acb0: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
acc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
acd0: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
ace0: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
acf0: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
ad00: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
ad10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
ad20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
ad30: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
ad40: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
ad50: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
ad60: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
ad70: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
ad80: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
ad90: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ada0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
adb0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
adc0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
add0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
ade0: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
adf0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
ae00: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
ae10: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
ae20: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
ae30: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
ae40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
ae50: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
ae60: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
ae70: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
ae80: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
ae90: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
aea0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
aeb0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
aec0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
aed0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
aee0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
aef0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
af00: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
af10: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
af20: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
af30: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
af40: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
af50: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
af60: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
af70: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
af80: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
af90: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
afa0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
afb0: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
afc0: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
afd0: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
afe0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
aff0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
b000: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
b010: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
b020: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
b030: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
b050: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
b060: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
b070: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
b080: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
b090: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
b0a0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
b0b0: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
b0c0: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
b0d0: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
b0e0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
b0f0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
b100: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
b110: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
b120: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
b130: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
b140: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
b150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
b160: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
b170: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
b180: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
b190: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
b1a0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
b1b0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
b1c0: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
b1d0: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
b1e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67  D_PARAMETER(pPag
b1f0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  e);.#endif..  as
b200: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
b210: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
b220: 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b    pEnd = pIter +
b230: 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70   9;.  while( (*p
b240: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
b250: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
b260: 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66  assert( debuginf
b270: 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70  o.nSize==(u16)(p
b280: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c  Iter - pCell) ||
b290: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
b2a0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49   return (u16)(pI
b2b0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a  ter - pCell);.}.
b2c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b2d0: 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61  DEBUG./* This va
b2e0: 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53  riation on cellS
b2f0: 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64  izePtr() is used
b300: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
b310: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  t() statements.*
b320: 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69  * only. */.stati
b330: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d  c u16 cellSize(M
b340: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b350: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74  nt iCell){.  ret
b360: 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  urn pPage->xCell
b370: 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64  Size(pPage, find
b380: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
b390: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
b3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b3b0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
b3c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
b3d0: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
b3e0: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
b3f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
b400: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
b410: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
b420: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
b430: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
b440: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
b450: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
b460: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
b470: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
b480: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
b490: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
b4a0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
b4b0: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
b4c0: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
b4d0: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  =0 );.  pPage->x
b4e0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
b4f0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
b500: 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
b510: 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  l<info.nPayload 
b520: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
b530: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
b540: 5f 57 49 54 48 49 4e 28 70 50 61 67 65 2d 3e 61  _WITHIN(pPage->a
b550: 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c 20  DataEnd, pCell, 
b560: 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61  pCell+info.nLoca
b570: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  l) ){.      *pRC
b580: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b590: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b5a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b5b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b5c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b5d0: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b5e0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b5f0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b600: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b610: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b620: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b630: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b640: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b650: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b660: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b670: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b680: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b690: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b6a0: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b6b0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b6c0: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b6d0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b6e0: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b6f0: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b700: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b710: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b720: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b730: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b740: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b750: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b760: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b770: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b780: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b790: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b7a0: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b7b0: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b7c0: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b7d0: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b7e0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b7f0: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b800: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b810: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b820: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b830: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b840: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b850: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b860: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b870: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b880: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b8b0: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8d0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
b8e0: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
b8f0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
b900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b910: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
b920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
b930: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
b940: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b950: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
b960: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
b970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b980: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
b990: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
b9a0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b9c0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
b9d0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
b9e0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
ba10: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ba20: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
ba30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
ba40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba50: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
ba60: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
ba70: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
ba80: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
ba90: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
baa0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bab0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bac0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bad0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bae0: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
baf0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bb00: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bb10: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bb20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bb30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bb40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bb50: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bb60: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bb70: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bb80: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bb90: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bba0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bbb0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bbc0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bbd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bbe0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bbf0: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bc00: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bc10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bc20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bc30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bc40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bc50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bc60: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bc70: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bc80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
bc90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bca0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
bcb0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
bcc0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
bcd0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
bcf0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
bd00: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69  a[hdr+3]) );.  i
bd10: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
bd20: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
bd30: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
bd40: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
bd50: 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54  bleSize;..  /* T
bd60: 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
bd70: 73 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f  s pages with two
bd80: 20 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62   or fewer free b
bd90: 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72  locks and nMaxFr
bda0: 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72  ag.  ** or fewer
bdb0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
bdc0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
bdd0: 69 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20  it is faster to 
bde0: 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77  move the.  ** tw
bdf0: 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b  o (or one) block
be00: 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67  s of cells using
be10: 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61   memmove() and a
be20: 64 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  dd the required.
be30: 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20    ** offsets to 
be40: 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20  each pointer in 
be50: 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
be60: 20 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69   array than it i
be70: 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e  s to .  ** recon
be80: 73 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72  struct the entir
be90: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66  e page.  */.  if
bea0: 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b  ( (int)data[hdr+
beb0: 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a  7]<=nMaxFrag ){.
bec0: 20 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20      int iFree = 
bed0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bee0: 64 72 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  dr+1]);..    /* 
bef0: 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 66  If the initial f
bf00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
bf10: 77 65 72 65 20 6f 75 74 20 6f 66 20 62 6f 75 6e  were out of boun
bf20: 64 73 2c 20 74 68 61 74 20 77 6f 75 6c 64 0a 20  ds, that would. 
bf30: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
bf40: 64 65 74 65 63 74 65 64 20 62 79 20 62 74 72 65  detected by btre
bf50: 65 49 6e 69 74 50 61 67 65 28 29 20 77 68 65 6e  eInitPage() when
bf60: 20 69 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e   it was computin
bf70: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  g the.    ** num
bf80: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bf90: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
bfa0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  /.    assert( iF
bfb0: 72 65 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d  ree<=usableSize-
bfc0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  4 );.    if( iFr
bfd0: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
bfe0: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
bff0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
c000: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
c010: 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  2>usableSize-4 )
c020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c030: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c040: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  e);.      if( 0=
c050: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
c060: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
c070: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
c080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
c090: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
c0a0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
c0b0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
c0c0: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
c0d0: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
c0e0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
c0f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
c100: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
c110: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
c120: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c130: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
c140: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
c150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c160: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c170: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
c180: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
c190: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
c1a0: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
c1b0: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
c1c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c1d0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c1e0: 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32        sz2 = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c200: 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  2+2]);.         
c210: 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20   if( iFree2+sz2 
c220: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  > usableSize ) r
c230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c240: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c250: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
c260: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
c270: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
c280: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
c290: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
c2a0: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
c2b0: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
c2c0: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
c2d0: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
c2e0: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
c2f0: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
c300: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
c310: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
c320: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
c330: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
c340: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
c350: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
c360: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
c370: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
c380: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
c390: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
c3a0: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
c3b0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c3c0: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
c3d0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
c3e0: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
c3f0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
c400: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
c410: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
c420: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
c430: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c440: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c450: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
c460: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
c470: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
c480: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
c490: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
c4a0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
c4b0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c4c0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
c4d0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
c4e0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c4f0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
c500: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c510: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
c520: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c530: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
c540: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
c550: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
c560: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
c570: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
c580: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
c590: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
c5a0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
c5b0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c5c0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c5d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
c5e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5f0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c600: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
c610: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
c620: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
c630: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
c640: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
c650: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
c660: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
c670: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
c680: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c690: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6c0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c6d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
c6e0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
c6f0: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
c700: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
c710: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
c720: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c730: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c740: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
c750: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
c760: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
c770: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
c780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c790: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
c7a0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
c7b0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
c7c0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
c7d0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
c7e0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
c7f0: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
c800: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
c810: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
c820: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
c830: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
c840: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
c850: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
c860: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
c870: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
c880: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
c890: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
c8a0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
c8b0: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
c8c0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
c8d0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
c8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c8f0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c900: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
c910: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
c920: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
c930: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
c940: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
c950: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
c960: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
c970: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
c980: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
c990: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
c9a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c9b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c9d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c9e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c9f0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
ca00: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
ca10: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
ca20: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
ca30: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
ca40: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
ca50: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
ca60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
ca70: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
ca80: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
ca90: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
caa0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
cab0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
cac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
cad0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
cae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
caf0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
cb00: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
cb10: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
cb20: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
cb30: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
cb40: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
cb50: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
cb60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
cb70: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
cb80: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
cb90: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
cba0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
cbb0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
cbc0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
cbd0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
cbe0: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
cbf0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
cc00: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
cc10: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cc20: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
cc30: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
cc40: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
cc50: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
cc60: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
cc70: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cc80: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
cc90: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
cca0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
ccb0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
ccc0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
ccd0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
cce0: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
ccf0: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
cd00: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
cd10: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
cd20: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  ;.  int size;   
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
cd40: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
cd50: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
cd60: 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  pc>0 );.  while(
cd70: 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d   pc<=usableSize-
cd80: 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  4 ){.    /* EVID
cd90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
cda0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
cdb0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
cdc0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
cdd0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
cde0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
cdf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ce00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
ce10: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
ce20: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
ce30: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
ce40: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
ce50: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
ce60: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
ce70: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
ce80: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
ce90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
cea0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
ceb0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
cec0: 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e     if( size+pc >
ced0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
cee0: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
cef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
cf00: 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  E(pPg);.        
cf10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
cf20: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
cf30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
cf40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
cf50: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
cf60: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
cf70: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
cf80: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
cf90: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
cfa0: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
cfb0: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
cfc0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
cfd0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
cfe0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
cff0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
d000: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
d010: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
d020: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
d030: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
d040: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
d050: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
d060: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
d070: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
d080: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
d090: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
d0a0: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
d0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
d0c0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
d0d0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
d0e0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
d0f0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
d100: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
d110: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
d120: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
d130: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
d140: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
d150: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
d160: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d170: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
d180: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
d190: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
d1a0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
d1b0: 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  c]);.    if( pc<
d1c0: 69 41 64 64 72 2b 73 69 7a 65 20 29 20 62 72 65  iAddr+size ) bre
d1d0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 63  ak;.  }.  if( pc
d1e0: 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53   ){.    *pRc = S
d1f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
d200: 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  GE(pPg);.  }..  
d210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
d230: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
d240: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
d250: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
d260: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
d270: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
d280: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
d290: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
d2a0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
d2b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
d2c0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
d2d0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
d2e0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
d2f0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
d300: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
d310: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
d320: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
d330: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
d340: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
d350: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
d360: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
d370: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d380: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
d390: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
d3a0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
d3b0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
d3c0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
d3d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d3e0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
d3f0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
d400: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
d410: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
d420: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
d430: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
d440: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
d450: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
d460: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
d470: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
d480: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
d490: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
d4a0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
d4b0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
d4c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d4d0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
d4e0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
d4f0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
d500: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
d510: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d520: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
d530: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
d540: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
d550: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
d560: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d570: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
d580: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d5b0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
d5c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
d5d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d5e0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
d5f0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
d600: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d610: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
d620: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
d630: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
d640: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
d650: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
d660: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
d670: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d680: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d690: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d6a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d6c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d6d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
d6f0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
d700: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
d710: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
d720: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
d730: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
d740: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
d750: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
d760: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
d770: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d780: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
d790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
d7a0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
d7b0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
d7c0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
d7d0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
d7e0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
d7f0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
d800: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
d810: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d820: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
d830: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
d840: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
d850: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
d860: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
d870: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
d880: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
d890: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
d8a0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
d8b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
d8c0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
d8d0: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
d8e0: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
d8f0: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
d900: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
d910: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
d920: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
d930: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
d940: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
d950: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
d960: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
d970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d980: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
d990: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
d9a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d9b0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
d9c0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
d9d0: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
d9e0: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
d9f0: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
da00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
da10: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
da20: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
da30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
da50: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
da60: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
da70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
da80: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
da90: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
daa0: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
dab0: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
dac0: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
dad0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
dae0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
daf0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
db00: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
db10: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
db20: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
db30: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
db40: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
db50: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
db60: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
db80: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
db90: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
dba0: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
dbb0: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
dbc0: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
dbd0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
dbe0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
dbf0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
dc00: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
dc10: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
dc20: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
dc30: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
dc40: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
dc50: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
dc60: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
dc70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
dc80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
dc90: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
dca0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
dcb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
dcc0: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
dcd0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
dce0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
dcf0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
dd00: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
dd10: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
dd20: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
dd30: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
dd40: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
dd50: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
dd60: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
dd70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dd80: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
dd90: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
dda0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
ddb0: 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50  pPage, MIN(4, pP
ddc0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b  age->nFree - (2+
ddd0: 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66  nByte)));.    if
dde0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ddf0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
de00: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
de10: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
de20: 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79  ssert( gap+2+nBy
de30: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
de40: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
de50: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
de60: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
de70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
de80: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
de90: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
dea0: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
deb0: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
dec0: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
ded0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
dee0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
def0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
df00: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
df10: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
df20: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
df30: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
df40: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
df50: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
df60: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
df70: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
df80: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
df90: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
dfa0: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
dfb0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
dfc0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
dfd0: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
dfe0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
dff0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
e000: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
e010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e020: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
e030: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
e040: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
e050: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
e060: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
e070: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
e080: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
e090: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
e0a0: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
e0b0: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
e0c0: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
e0d0: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
e0e0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
e0f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
e100: 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  t even though th
e110: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
e120: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
e130: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
e140: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
e150: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
e160: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
e170: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
e180: 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
e190: 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
e1a0: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
e1b0: 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
e1c0: 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
e1d0: 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
e1e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e1f0: 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
e200: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
e210: 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
e220: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
e230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e240: 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
e250: 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
e260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e270: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
e280: 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
e290: 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
e2a0: 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e2d0: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
e2e0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
e2f0: 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e320: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
e330: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
e340: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
e370: 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
e380: 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
e390: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3b0: 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
e3c0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
e3d0: 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
e3e0: 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
e3f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
e400: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
e410: 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20  ze */.  u16 x;  
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e440: 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
e450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
e460: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
e470: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
e480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e490: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
e4a0: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
e4b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e4c0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
e4d0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
e4e0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
e4f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
e500: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
e520: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
e530: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e540: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
e550: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
e560: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
e570: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e580: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
e590: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
e5a0: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
e5b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e5e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
e600: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
e610: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
e620: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
e630: 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65 2d  ( iStart<=pPage-
e640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e650: 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  -4 );..  /* The 
e660: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
e670: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
e680: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
e690: 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73  Find the .  ** s
e6a0: 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  pot on the list 
e6b0: 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f  where iStart sho
e6c0: 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
e6d0: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
e6e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
e6f0: 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31    iPtr = hdr + 1
e700: 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74  ;.  if( data[iPt
e710: 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  r+1]==0 && data[
e720: 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iPtr]==0 ){.    
e730: 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f  iFreeBlk = 0;  /
e740: 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
e750: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
e760: 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
e770: 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ty */.  }else{. 
e780: 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65     while( (iFree
e790: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e7a0: 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74  data[iPtr]))<iSt
e7b0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
e7c0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
e7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e7e0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72  iFreeBlk==0 ) br
e7f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  eak;.        ret
e800: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e810: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
e830: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
e840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
e850: 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74  eeBlk>pPage->pBt
e860: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
e870: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e880: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e890: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
e8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
e8b0: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
e8c0: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
e8d0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e8e0: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
e8f0: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
e900: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
e910: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
e920: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
e930: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
e940: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
e950: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
e960: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
e970: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
e980: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
e990: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
e9a0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e9b0: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
e9c0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
e9d0: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
e9e0: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
e9f0: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
ea00: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
ea10: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
ea20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ea30: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
ea40: 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  );.      iEnd = 
ea50: 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62  iFreeBlk + get2b
ea60: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
ea70: 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  lk+2]);.      if
ea80: 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e  ( iEnd > pPage->
ea90: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
eaa0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
eab0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eac0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ead0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a      }.      iSiz
eae0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
eaf0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
eb00: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
eb10: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
eb20: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
eb30: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
eb40: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
eb50: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
eb60: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
eb70: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
eb80: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
eb90: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
eba0: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
ebb0: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
ebc0: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
ebd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
ebe0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ebf0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
ec00: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
ec10: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
ec20: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
ec30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
ec40: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
ec50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
ec60: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
ec70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ec80: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
ec90: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
eca0: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
ecb0: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
ecc0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
ecd0: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
ece0: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ed00: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
ed10: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ed20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ed30: 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  age);.    data[h
ed40: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
ed50: 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79    }.  x = get2by
ed60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ed70: 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d  ;.  if( iStart<=
ed80: 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  x ){.    /* The 
ed90: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
eda0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
edb0: 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
edc0: 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
edd0: 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
ede0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
edf0: 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
ee00: 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
ee10: 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
ee20: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
ee30: 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20  if( iStart<x || 
ee40: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
ee50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ee60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
ee70: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ee80: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
ee90: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
eea0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
eeb0: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
eec0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
eed0: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
eee0: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
eef0: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
ef00: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
ef10: 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20   iStart);.  }.  
ef20: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
ef30: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
ef40: 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
ef50: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
ef60: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
ef70: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
ef80: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
ef90: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
efa0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
efb0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
efc0: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
efd0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  ize);.  }.  put2
efe0: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
eff0: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
f000: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f010: 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
f020: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
f030: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
f040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f050: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
f060: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
f070: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
f080: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
f090: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
f0a0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
f0b0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
f0c0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
f0d0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
f0e0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
f0f0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
f100: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
f110: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
f120: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
f130: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
f140: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
f150: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f160: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
f170: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
f180: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
f190: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f1a0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
f1b0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
f1e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
f1f0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
f200: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
f210: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
f220: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
f230: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
f240: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
f250: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
f260: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
f270: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
f280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f290: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f2a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f2b0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
f2c0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
f2d0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
f2e0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
f2f0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
f300: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
f310: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
f320: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
f330: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
f340: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
f350: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
f360: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
f370: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
f380: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f390: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
f3a0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f3b0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
f3c0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
f3d0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
f3e0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
f3f0: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
f400: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
f410: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
f420: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
f430: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
f440: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f450: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
f460: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
f470: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f480: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
f490: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
f4a0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f4b0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
f4c0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
f4d0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
f4e0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f4f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
f500: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
f510: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f520: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
f530: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f540: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f550: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
f560: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f570: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f580: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
f590: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
f5a0: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
f5b0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
f5c0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
f5d0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
f5e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
f5f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
f600: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
f610: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f620: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
f630: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
f640: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
f650: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
f660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
f670: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
f680: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
f690: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
f6a0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
f6b0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
f6c0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f6d0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
f6e0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
f6f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
f700: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
f710: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
f720: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
f730: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
f740: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
f750: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
f760: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
f770: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
f780: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f790: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
f7a0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f7b0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
f7c0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f7d0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
f7e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
f7f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
f800: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
f810: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f820: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
f830: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
f840: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
f850: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
f860: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
f870: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
f880: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
f890: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
f8a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f8b0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
f8c0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
f8d0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
f8e0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
f8f0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
f900: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f910: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
f920: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
f930: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
f940: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
f950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
f960: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
f970: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
f980: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
f990: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
f9a0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f9b0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
f9c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
f9d0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
f9e0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
f9f0: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
fa00: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
fa10: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
fa20: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
fa30: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
fa40: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
fa50: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
fa60: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fa70: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
fa80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
fa90: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
faa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
fab0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
fac0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
fad0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64  ata[] */.  u8 hd
fae0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
faf0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
fb00: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
fb10: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
fb20: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
fb30: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
fb40: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
fb50: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
fb60: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
fb70: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
fb80: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
fb90: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
fba0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
fbb0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
fbc0: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
fbd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
fbe0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
fbf0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
fc00: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
fc10: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
fc20: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
fc30: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
fc40: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
fc50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
fc60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
fc70: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
fc80: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ea */.  int iCel
fc90: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
fca0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
fcb0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
fcc0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
fcd0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
fce0: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
fcf0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
fd00: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61  k offset */..  a
fd10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fd20: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
fd30: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
fd40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fd50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fd60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
fd70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
fd80: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
fd90: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
fda0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
fdb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fdc0: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
fde0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
fdf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fe00: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
fe10: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
fe20: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
fe30: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
fe40: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
fe50: 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50  0 );..  pBt = pP
fe60: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20  age->pBt;.  hdr 
fe70: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
fe80: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
fe90: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20  ge->aData;.  /* 
fea0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
feb0: 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f  8594-02890 The o
fec0: 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20  ne-byte flag at 
fed0: 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74  offset 0 indicat
fee0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74  ing.  ** the b-t
fef0: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
ff00: 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c  /.  if( decodeFl
ff10: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ff20: 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  hdr]) ){.    ret
ff30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ff40: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ff50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
ff60: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
ff70: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
ff80: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
ff90: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
ffa0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
ffb0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
ffc0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
ffd0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
ffe0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fff0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
10000 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
10010 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
10020 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10030 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  ze;.  pPage->aDa
10040 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
10050 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
10060 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
10070 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
10080 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
10090 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
100a0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
100b0 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ];.  /* EVIDENCE
100c0 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
100d0 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
100e0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
100f0 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
10100 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10110 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10120 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10130 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
10140 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e  teger is.  ** in
10150 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
10160 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  36. */.  top = g
10170 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
10180 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
10190 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
101a0 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
101b0 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
101c0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
101d0 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  ives the.  ** nu
101e0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
101f0 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
10200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
10210 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
10220 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  r+3]);.  if( pPa
10230 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
10240 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
10250 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
10260 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
10270 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
10280 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
10290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
102a0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
102b0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age);.  }.  test
102c0 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
102d0 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
102e0 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
102f0 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
10300 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
10310 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
10320 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
10330 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
10340 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
10350 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
10360 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
10370 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66  hen the.  ** off
10380 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
10390 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
103a0 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
103b0 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
103c0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
103d0 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
103e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
103f0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
10400 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
10410 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
10420 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
10430 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
10440 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
10450 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
10460 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77  d.  ** of page w
10470 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
10480 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ll.  .  **.  ** 
10490 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
104a0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
104b0 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
104c0 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
104d0 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20  s.  ** past the 
104e0 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
104f0 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
10500 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
10510 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74   to be .  ** ret
10520 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
10530 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69  ..  */.  iCellFi
10540 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
10550 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10560 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
10570 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10580 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e  .  if( pBt->db->
10590 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
105a0 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20  ellSizeCk ){.   
105b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
105c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
105d0 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
105e0 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  r array */.    i
105f0 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
10600 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
10610 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21  ll */..    if( !
10620 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
10630 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66  ellLast--;.    f
10640 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
10650 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
10660 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
10670 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63  eAligned(&data[c
10680 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
10690 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
106a0 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
106b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
106c0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
106d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
106e0 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
106f0 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
10700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10710 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10720 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10730 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61  }.      sz = pPa
10740 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
10750 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
10760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10770 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
10780 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
10790 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
107a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
107b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
107c0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
107d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
107e0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
107f0 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
10800 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d  .  }  ..  /* Com
10810 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
10820 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
10830 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45   page.  ** EVIDE
10840 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
10850 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
10860 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
10870 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
10880 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  .  ** start of t
10890 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
108a0 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
108b0 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
108c0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
108d0 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
108e0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
108f0 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
10900 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
10910 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
10920 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
10930 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
10940 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70  space */.  if( p
10950 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  c>0 ){.    u32 n
10960 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
10970 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10980 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
10990 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
109a0 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
109b0 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
109c0 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
109d0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  .      ** always
109e0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
109f0 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10a00 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10a10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10a30 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10a40 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  e); .    }.    w
10a50 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
10a60 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
10a70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
10a80 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
10a90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
10aa0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
10ab0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10ac0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
10ae0 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
10af0 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
10b00 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
10b10 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
10b20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10b30 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10b40 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
10b50 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
10b60 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
10b70 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74    }.    if( next
10b80 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  >0 ){.      /* F
10b90 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
10ba0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
10bb0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10bc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10bd0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10be0 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10bf0 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10c00 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10c10 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
10c20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
10c30 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
10c40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10c50 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10c60 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
10c70 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
10c80 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
10c90 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
10ca0 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10cb0 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
10cc0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10cd0 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10ce0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10cf0 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a  ytes within.  **
10d00 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10d10 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
10d20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
10d30 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
10d40 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
10d50 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
10d60 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
10d70 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
10d80 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74  so.  ** serves t
10d90 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
10da0 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10db0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10dc0 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61  l-content.  ** a
10dd0 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
10de0 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
10df0 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
10e00 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  he page..  */.  
10e10 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
10e20 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
10e30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10e40 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10e50 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
10e60 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
10e70 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
10e80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
10e90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
10ea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10eb0 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10ec0 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10ed0 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10ee0 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10ef0 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10f00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
10f10 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
10f20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
10f30 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
10f40 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
10f50 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
10f60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
10f70 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
10f80 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
10f90 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
10fa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10fb0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10fc0 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10fd0 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10ff0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11000 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11010 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11020 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11030 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11040 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11050 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
11060 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11070 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
11080 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
110a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
110b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
110c0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
110d0 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
110e0 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ECURE ){.    mem
110f0 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
11100 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
11110 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
11120 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
11130 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
11140 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
11150 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
11160 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
11170 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
11180 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
11190 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
111a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
111b0 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
111c0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
111d0 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
111e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
111f0 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
11200 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
11210 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
11220 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
11230 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
11240 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
11250 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
11260 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
11270 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
11280 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
11290 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
112a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
112b0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
112c0 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
112d0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
112e0 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
112f0 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
11300 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
11310 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
11320 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
11330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
11340 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
11350 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
11360 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
11370 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
11380 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
11390 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
113a0 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
113b0 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
113c0 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
113d0 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
113e0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
113f0 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
11400 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
11410 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
11420 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
11430 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11440 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
11450 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
11460 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
11470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11480 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
11490 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
114a0 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
114b0 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
114c0 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
114d0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
114e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
114f0 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
11500 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
11510 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11520 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
11530 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
11540 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11550 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
11560 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11570 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
11580 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
11590 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
115a0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
115b0 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
115c0 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
115d0 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
115e0 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
115f0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
11600 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
11610 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
11620 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
11630 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11640 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
11650 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
11660 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
11670 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
11680 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
11690 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
116a0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
116b0 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
116c0 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
116d0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
116e0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
116f0 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
11700 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
11710 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
11720 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
11730 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
11740 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
11750 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
11760 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11770 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
11780 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
11790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
117a0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
117b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
117c0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
117d0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
117e0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
117f0 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
11800 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11810 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11820 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11830 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11840 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
11850 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
11860 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
11870 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
11880 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
11890 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
118a0 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
118b0 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
118c0 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
118d0 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
118e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
118f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11900 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11910 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
11920 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
11930 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
11940 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
11950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11960 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
11970 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
11980 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
11990 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
119a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
119b0 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
119c0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
119d0 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
119e0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
119f0 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
11a00 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
11a10 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
11a20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
11a30 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
11a40 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
11a50 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
11a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
11a70 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
11a80 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
11a90 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
11aa0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
11ab0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
11ac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11ad0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11ae0 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
11af0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
11b00 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11b10 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
11b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
11b30 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11b40 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
11b50 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
11b60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11b70 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
11b80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11b90 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
11ba0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
11bb0 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
11bc0 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
11bd0 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
11be0 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
11bf0 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
11c00 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
11c10 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
11c20 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
11c30 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
11c40 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
11c50 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
11c60 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
11c70 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
11c80 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
11c90 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
11ca0 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  rn btreePagecoun
11cb0 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a  t(p->pBt);.}../*
11cc0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11cd0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
11ce0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
11cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d  .**.** If pCur!=
11d00 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  0 then the page 
11d10 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64  is being fetched
11d20 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f   as part of a mo
11d30 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63  veToChild().** c
11d40 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f  all.  Do additio
11d50 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
11d60 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
11d70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
11d80 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63   And if the fetc
11d90 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f  h fails, this ro
11da0 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65  utine must decre
11db0 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65  ment pCur->iPage
11dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
11dd0 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72   is fetched as r
11de0 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73  ead-write unless
11df0 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c   pCur is not NUL
11e00 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65  L and is.** a re
11e10 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a  ad-only cursor..
11e20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
11e30 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a  r occurs, then *
11e40 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69  ppPage is undefi
11e50 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
11e60 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
11e70 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
11e80 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
11e90 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
11ea0 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
11eb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11ec0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
11ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
11ee0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
11ef0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
11f20 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
11f30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
11f40 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
11f50 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11f60 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
11f70 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
11f80 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
11f90 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11fa0 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
11fb0 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  page, or NULL */
11fc0 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79  .  int bReadOnly
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
11ff0 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20   read-only page 
12000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12010 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
12020 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
12030 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12040 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12050 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
12060 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75   || ppPage==&pCu
12070 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
12080 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
12090 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
120a0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
120b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
120c0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
120d0 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
120e0 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
120f0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
12100 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12110 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
12120 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
12130 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
12140 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12150 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
12160 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
12170 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
12180 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
12190 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
121a0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
121b0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
121c0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
121d0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
121e0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
121f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
12200 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
12210 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
12220 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12230 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
12240 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
12250 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12270 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
12280 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
12290 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
122a0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
122b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
122c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
122d0 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
122e0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
122f0 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
12300 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
12310 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
12320 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
12330 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
12340 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
12350 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
12360 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
12370 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
12380 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
12390 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
123a0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
123b0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
123c0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
123d0 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
123e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
123f0 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72  GNO(pgno);.    r
12400 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12410 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
12420 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
12430 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
12440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
12450 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12460 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  r:.  if( pCur ){
12470 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
12480 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  --;.    pCur->pP
12490 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
124a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
124b0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
124c0 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
124d0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
124e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
124f0 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
12500 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
12510 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
12520 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
12530 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
12540 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
12550 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
12560 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
12570 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
12580 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
12590 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
125a0 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
125b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
125c0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
125d0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
125e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
125f0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12600 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
12610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12620 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
12630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12640 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
12650 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
12660 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
12670 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
12680 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12690 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
126a0 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
126b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
126c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
126e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
126f0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
12700 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
12710 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12720 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
12730 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12740 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
12750 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
12760 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
12770 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12780 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
12790 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
127a0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
127b0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
127c0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
127d0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
127e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
127f0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
12800 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12810 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
12820 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
12830 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
12840 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12850 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
12860 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
12870 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
12880 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12890 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
128a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
128b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
128c0 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
128d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
128e0 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
128f0 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
12900 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
12910 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
12920 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
12930 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
12940 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12950 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
12960 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
12970 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
12980 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
12990 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
129a0 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
129b0 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
129c0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
129d0 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
129e0 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
129f0 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
12a00 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
12a10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
12a20 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
12a30 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
12a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12a50 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12a60 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12a70 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12a80 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
12a90 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
12aa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
12ab0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12ac0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
12ad0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
12ae0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12af0 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
12b00 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
12b10 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
12b20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
12b40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
12b50 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
12b60 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
12b70 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
12b80 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12b90 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
12ba0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
12bb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12bc0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
12bd0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
12be0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12bf0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12c10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
12c20 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
12c30 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
12c40 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
12c50 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
12c60 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
12c70 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
12c80 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
12c90 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
12ca0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
12cb0 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
12cc0 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
12cd0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
12ce0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
12cf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
12d00 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
12d10 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
12d20 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
12d30 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
12d40 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
12d50 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
12d60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12d70 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
12d80 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
12d90 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
12da0 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
12db0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
12dc0 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
12dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12de0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12df0 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
12e00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
12e10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12e30 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12e40 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
12e50 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12e60 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
12e70 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12e80 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
12e90 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
12ea0 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
12eb0 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
12ec0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
12ed0 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
12ee0 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
12ef0 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
12f00 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
12f10 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
12f20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12f30 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
12f40 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
12f50 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
12f60 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
12f70 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
12f80 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
12f90 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
12fa0 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
12fb0 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
12fc0 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
12fd0 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
12fe0 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
12ff0 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
13000 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
13010 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
13020 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
13030 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
13040 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13050 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
13060 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
13070 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
13080 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
13090 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
130a0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
130b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
130c0 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
130d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
130e0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
130f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13100 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
13110 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
13120 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
13130 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
13140 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20  >busyHandler,.  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
13180 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a  (pBt->pPager));.
13190 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
131a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
131b0 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
131c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
131d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
131e0 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
131f0 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
13200 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
13210 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
13220 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
13230 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
13240 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
13250 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
13260 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
13270 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
13280 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
13290 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
132a0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
132b0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
132c0 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
132d0 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
132e0 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
132f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13300 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13310 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
13320 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
13330 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
13340 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
13350 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
13360 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
13370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
13380 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
13390 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
133a0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
133b0 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
133c0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
133d0 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
133e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
133f0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
13400 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
13410 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
13420 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
13430 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
13440 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
13450 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
13460 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
13470 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13480 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
13490 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
134a0 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
134b0 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
134c0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
134d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
134e0 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
134f0 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
13500 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
13510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13520 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
13530 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13540 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
13550 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
13560 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13570 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
13580 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13590 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
135a0 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
135b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
135c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
135d0 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
135e0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
135f0 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
13600 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
13610 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
13620 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
13630 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
13640 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13650 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
13660 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13680 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
13690 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
136a0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
136b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
136c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
136d0 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
136e0 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
136f0 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
13720 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
13730 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13740 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
13750 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
13760 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
13770 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
13780 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13790 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
137a0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
137b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
137c0 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
137f0 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
13800 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
13810 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
13820 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
13830 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
13840 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
13850 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
13860 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
13870 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
13880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
13890 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
138a0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
138b0 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
138c0 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
138d0 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
138e0 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
138f0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
13900 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
13910 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
13920 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
13930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13940 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
13950 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
13960 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
13970 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
13980 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
13990 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
139a0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
139d0 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
139e0 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
13a10 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13a20 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
13a30 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
13a40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13a50 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
13a60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13a70 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13a80 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13a90 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
13aa0 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
13ab0 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
13ac0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
13ad0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
13ae0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
13af0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
13b00 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
13b10 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
13b20 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
13b30 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
13b40 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
13b50 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
13b60 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
13b70 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
13b80 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
13b90 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
13ba0 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
13bb0 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
13bc0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
13bd0 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
13be0 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
13bf0 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
13c00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13c10 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
13c20 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
13c30 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
13c40 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
13c50 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
13c60 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
13c70 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
13c80 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
13c90 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
13ca0 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
13cb0 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
13cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13cd0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
13ce0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
13cf0 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
13d00 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
13d10 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13d20 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
13d30 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
13d40 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
13d50 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
13d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13d70 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
13d80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
13d90 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
13da0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
13db0 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
13dc0 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
13dd0 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
13de0 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
13df0 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
13e00 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
13e10 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
13e20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
13e30 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
13e40 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
13e50 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
13e60 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
13e70 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
13e80 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13e90 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
13ea0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
13eb0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13ec0 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
13ed0 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
13ee0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
13ef0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
13f00 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
13f10 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
13f20 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
13f30 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
13f40 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
13f50 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
13f60 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
13f70 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
13f80 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
13f90 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
13fa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
13fb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ff0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
14000 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
14010 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
14020 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
14030 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
14040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14050 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
14060 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
14070 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
140a0 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
140b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
140c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
140d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
140e0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
140f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14100 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
14110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14130 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
14140 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
14150 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
14160 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14170 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14180 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
14190 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
141a0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
141b0 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
141c0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
141d0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
141e0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
141f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14200 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
14210 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
14220 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
14230 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14240 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14250 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
14260 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
14270 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
14280 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
14290 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
142a0 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
142b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
142c0 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
142d0 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
142e0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
142f0 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
14300 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
14310 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
14320 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
14330 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
14340 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
14350 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
14360 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
14370 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
14380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14390 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
143a0 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
143b0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
143c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
143d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
143e0 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
143f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14400 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14410 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
14420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14430 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14450 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14460 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14470 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
14480 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
14490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
144a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
144b0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
144c0 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
144d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
14500 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14510 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14530 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14540 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14550 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
14560 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
14570 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
14580 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
14590 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
145a0 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
145b0 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
145c0 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
145d0 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
145e0 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
145f0 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
14600 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
14610 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
14620 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
14630 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
14640 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
14650 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
14660 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
14670 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
14680 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
14690 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
146a0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
146b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
146c0 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
146d0 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
146e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
146f0 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
14700 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
14710 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
14720 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
14730 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
14740 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
14750 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
14760 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
14770 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
14780 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
14790 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
147a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
147b0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
147c0 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
147d0 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
147e0 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
147f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14800 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
14810 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
14820 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
14830 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
14840 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
14850 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
14860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14870 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
14880 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14890 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
148a0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
148b0 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
148c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65         sizeof(Me
148f0 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76  mPage), flags, v
14900 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
14910 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
14920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14930 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14940 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14950 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14960 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14980 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
14990 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
149a0 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
149b0 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
149c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
149d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
149e0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
149f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14a00 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
14a10 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
14a20 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14a30 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14a40 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yHandler(pBt->pP
14a50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14a60 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14a70 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
14a80 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
14a90 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
14aa0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
14ab0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
14ac0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
14ad0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
14ae0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
14af0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
14b00 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
14b10 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
14b20 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
14b30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
14b40 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69  URE_DELETE;.#eli
14b50 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14b60 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c  _FAST_SECURE_DEL
14b70 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
14b80 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56  sFlags |= BTS_OV
14b90 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  ERWRITE;.#endif.
14ba0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14bb0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
14bc0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
14bd0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
14be0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
14bf0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
14c00 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
14c10 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
14c20 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
14c30 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
14c40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
14c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14c60 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
14c70 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
14c80 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
14c90 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
14ca0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
14cb0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
14cc0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
14cd0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14ce0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
14cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
14d00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
14d10 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
14d20 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
14d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14d40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14d50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
14d60 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
14d70 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
14d80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14d90 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
14da0 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
14db0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
14dc0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
14dd0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
14de0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
14df0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
14e00 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
14e10 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
14e20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
14e30 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14e40 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
14e50 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
14e60 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
14e70 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
14e80 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
14e90 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
14ea0 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
14eb0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
14ec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14ed0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
14ee0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14ef0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14f00 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14f10 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
14f20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
14f30 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14f40 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14f50 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
14f60 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14f70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
14f80 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
14f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14fa0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14fb0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
14fc0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
14fd0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
14fe0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
14ff0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
15000 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
15010 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
15020 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
15030 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
15040 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
15050 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
15060 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
15070 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
15080 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15090 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
150a0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
150b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
150c0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
150d0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
150e0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
150f0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
15100 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15110 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15120 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
15130 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
15140 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
15150 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15160 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
15170 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
15180 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15190 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
151a0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
151b0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
151c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
151d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
151e0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
151f0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
15200 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
15210 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
15220 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
15230 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
15240 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15250 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15260 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15270 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
15280 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
15290 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
152a0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
152b0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
152c0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
152d0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
152e0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
152f0 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
15300 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15310 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
15320 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
15330 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
15340 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
15350 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15360 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15370 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
15380 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
15390 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
153a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
153b0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
153c0 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
153d0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
153e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
153f0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
15400 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
15410 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15420 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15430 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
15440 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15460 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15470 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
15480 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
15490 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
154a0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
154b0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
154c0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
154d0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
154e0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
154f0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
15500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15510 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
15520 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
15530 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
15540 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15550 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
15560 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15570 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15580 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
15590 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
155a0 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
155b0 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
155c0 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
155d0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
155e0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
155f0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
15600 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
15610 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
15620 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
15630 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
15640 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
15650 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15660 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
15670 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
15680 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
15690 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
156a0 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
156b0 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
156c0 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
156e0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
156f0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
15700 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
15710 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
15720 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
15730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15740 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
15750 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
15760 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15770 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
15780 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15790 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
157a0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
157b0 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
157c0 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
157d0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
157e0 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
157f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
15800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
15810 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
15820 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
15830 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
15840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
15850 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
15860 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
15870 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
15880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15890 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
158a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
158b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
158c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
158d0 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
158e0 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
158f0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
15900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15910 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
15920 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
15930 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
15940 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
15950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15960 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
15970 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15980 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
15990 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
159a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
159b0 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
159c0 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
159d0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
159e0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
159f0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
15a00 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
15a10 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
15a20 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
15a30 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
15a40 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
15a50 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
15a60 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
15a70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
15a80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15a90 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
15aa0 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
15ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15ac0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15ad0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
15ae0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15af0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
15b00 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
15b10 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
15b20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15b30 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
15b40 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
15b50 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15b60 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
15b70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
15b80 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
15b90 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
15ba0 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
15bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
15bc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15bd0 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
15be0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15bf0 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
15c00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
15c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
15c30 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
15c40 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
15c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15c60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
15c70 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
15c80 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
15c90 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
15ca0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
15cb0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
15cc0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
15cd0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
15ce0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
15cf0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
15d00 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
15d10 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
15d20 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
15d30 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
15d40 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
15d50 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
15d60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15d90 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
15da0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
15db0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
15dc0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
15dd0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
15de0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15df0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
15e00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15e10 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
15e20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
15e30 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15e40 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15e50 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
15e60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15e70 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
15e80 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
15e90 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
15ea0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
15eb0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
15ec0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
15ed0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
15ee0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15ef0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15f00 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
15f10 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15f20 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
15f30 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15f40 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15f50 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
15f60 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
15f70 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
15f80 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
15f90 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
15fa0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
15fb0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
15fc0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
15fd0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
15fe0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
15ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16000 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
16010 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
16020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
16030 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
16040 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
16050 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
16060 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16070 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
16080 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
16090 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
160a0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
160b0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
160c0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
160d0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
160e0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
160f0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
16100 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
16110 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
16120 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
16130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
16140 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
16150 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16160 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
16170 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
16180 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
16190 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
161a0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
161b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
161c0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
161d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
161e0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
161f0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
16200 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
16210 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
16220 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
16230 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
16240 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
16250 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
16260 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
16270 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
16280 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
16290 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
162a0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
162b0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
162c0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
162d0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
162e0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
162f0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
16300 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
16310 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
16320 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
16330 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
16340 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
16350 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
16360 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
16370 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
16380 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
16390 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
163a0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
163b0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
163c0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
163d0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
163e0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
163f0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
16400 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
16410 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
16420 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
16430 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16440 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
16450 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
16460 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
16470 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
16480 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
16490 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
164a0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
164b0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
164c0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
164d0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
164e0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
164f0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
16500 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
16510 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
16520 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
16530 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
16540 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
16550 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
16560 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16570 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
16580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
16590 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
165a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
165b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
165c0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
165d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
165e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
165f0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16600 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
16610 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
16620 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
16630 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16640 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
16650 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
16660 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
16670 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
16680 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
16690 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
166a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
166b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
166c0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
166d0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
166e0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
166f0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
16700 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
16710 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16720 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16730 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16740 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16750 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
16760 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
16770 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
16780 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
16790 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
167a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
167b0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
167c0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
167d0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
167e0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
167f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
16800 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
16810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
16820 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
16830 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
16840 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
16850 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
16860 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
16870 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
16880 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
16890 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
168a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
168b0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
168c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
168d0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
168e0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
168f0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
16900 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
16910 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
16920 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
16930 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
16940 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
16950 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
16960 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
16970 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
16980 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16990 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
169a0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
169b0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
169c0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
169d0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
169e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
169f0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
16a00 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
16a10 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
16a20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
16a30 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
16a40 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
16a50 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
16a60 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
16a70 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
16a80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
16a90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16aa0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
16ac0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
16ad0 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
16ae0 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
16af0 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
16b00 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
16b10 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
16b20 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
16b30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16b40 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
16b50 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
16b60 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
16b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
16b80 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
16b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ba0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16bb0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16bc0 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
16bd0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
16be0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
16bf0 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
16c00 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
16c10 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
16c20 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
16c30 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
16c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
16c50 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
16c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16c70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16c80 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
16c90 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
16ca0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
16cb0 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
16cc0 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
16cd0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
16ce0 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
16cf0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
16d00 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
16d10 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
16d20 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
16d30 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
16d40 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
16d50 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
16d60 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
16d70 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
16d80 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
16d90 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
16da0 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
16db0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16dc0 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
16dd0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16de0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16df0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16e10 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16e20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16e30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16e50 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
16e60 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
16e70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
16e80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16eb0 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
16ec0 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
16ed0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16ee0 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
16ef0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16f00 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
16f10 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
16f20 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
16f30 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
16f40 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
16f50 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
16f60 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
16f70 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
16f80 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
16f90 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
16fa0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
16fb0 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
16fc0 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
16fd0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
16fe0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
16ff0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
17000 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
17010 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
17020 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
17030 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
17040 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
17050 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
17060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17070 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
17080 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17090 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
170a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
170b0 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
170c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
170d0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
170e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
170f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
17100 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
17110 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
17120 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
17130 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
17140 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17150 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
17160 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17170 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
17180 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
17190 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
171a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
171b0 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
171c0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
171d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
171e0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
171f0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
17200 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
17210 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17220 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17230 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17240 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17250 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17260 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17270 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
17280 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
17290 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
172a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
172b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
172c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
172d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
172e0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
172f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
17300 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
17310 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
17320 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
17330 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
17340 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
17350 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
17360 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
17370 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
17380 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
17390 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
173a0 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
173b0 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
173c0 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
173d0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
173e0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
173f0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
17400 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
17410 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
17420 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
17430 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
17440 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
17450 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
17460 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
17470 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
17480 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
17490 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
174a0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
174b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
174c0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
174d0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
174e0 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
174f0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17510 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
17520 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
17530 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
17540 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
17550 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
17560 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
17570 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17580 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17590 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
175a0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
175b0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
175c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
175d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
175e0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
175f0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
17600 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17610 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17630 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
17640 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
17650 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
17660 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
17670 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
17680 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
17690 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
176a0 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
176b0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
176c0 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
176d0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
176e0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
176f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
17700 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
17710 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
17720 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
17730 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
17740 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
17750 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
17760 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
17770 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
17780 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
17790 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
177a0 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
177b0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
177c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
177d0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
177e0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
177f0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
17800 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
17810 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
17820 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
17830 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
17840 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
17850 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
17860 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
17870 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
17880 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
17890 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
178a0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
178b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
178c0 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
178d0 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
178e0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
178f0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
17900 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
17910 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
17920 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
17930 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
17940 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
17950 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
17960 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
17970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17980 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
17990 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
179a0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
179b0 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
179c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
179d0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
179e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
179f0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
17a00 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
17a10 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
17a20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17a30 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
17a40 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
17a50 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
17a60 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
17a70 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17a80 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
17a90 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
17aa0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17ab0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
17ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17af0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
17b00 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
17b10 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
17b20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
17b30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17b40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17b50 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
17b60 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
17b70 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
17b80 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
17b90 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
17ba0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
17bb0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
17bc0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
17bd0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
17be0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
17bf0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
17c00 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
17c10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
17c20 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
17c30 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
17c40 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
17c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17c60 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
17c70 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
17c80 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
17c90 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
17ca0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
17cb0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
17cc0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
17cd0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
17ce0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
17cf0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
17d00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17d20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17d30 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
17d40 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
17d50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17d60 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
17d70 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
17d80 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
17db0 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
17dc0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
17dd0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
17de0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
17df0 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
17e00 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17e10 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
17e20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
17e30 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
17e40 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
17e50 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
17e60 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
17e70 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
17e80 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
17e90 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
17ea0 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
17eb0 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
17ec0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
17ed0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
17ee0 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
17ef0 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
17f00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
17f10 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
17f20 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
17f30 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
17f40 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
17f50 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
17f60 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
17f70 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
17f80 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
17f90 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
17fa0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
17fb0 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
17fc0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
17fd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17fe0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
17ff0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18000 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
18010 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
18020 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
18030 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
18040 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18050 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
18060 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
18070 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
18080 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
18090 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
180a0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
180b0 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
180c0 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
180d0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
180e0 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
180f0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
18100 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
18110 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
18120 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
18130 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
18140 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
18150 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
18160 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
18170 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
18180 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18190 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
181a0 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
181b0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
181c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
181d0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
181e0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
181f0 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
18200 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18210 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
18220 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
18230 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
18240 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
18250 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18260 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18270 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
18280 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
18290 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
182a0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
182b0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
182c0 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
182d0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
182e0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
182f0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
18300 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
18310 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
18320 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
18330 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
18340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18350 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
18360 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
18370 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
18380 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18390 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
183a0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
183b0 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
183c0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
183d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
183e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
183f0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
18400 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ge the values fo
18410 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  r the BTS_SECURE
18420 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
18430 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a  OVERWRITE flags:
18440 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  .**.**    newFla
18450 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20  g==0       Both 
18460 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18470 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
18480 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a  ITE are cleared.
18490 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31  **    newFlag==1
184a0 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
184b0 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64  E_DELETE set and
184c0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
184d0 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  s cleared.**    
184e0 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20  newFlag==2      
184f0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18500 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42  TE cleared and B
18510 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
18520 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  set.**    newFla
18530 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68  g==(-1)    No ch
18540 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73  anges.**.** This
18550 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
18560 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46   a query if newF
18570 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  lag is less than
18580 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68   zero.**.** With
18590 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73   BTS_OVERWRITE s
185a0 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  et, deleted cont
185b0 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  ent is overwritt
185c0 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74  en by zeros, but
185d0 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61  .** freelist lea
185e0 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  f pages are not 
185f0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
18600 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
18610 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64  hus in-page.** d
18620 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18630 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66  s cleared, but f
18640 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20  reelist deleted 
18650 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a  content is not..
18660 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53  **.** With BTS_S
18670 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70  ECURE_DELETE, op
18680 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20  eration is like 
18690 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69  BTS_OVERWRITE wi
186a0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a  th the addition.
186b0 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74  ** that freelist
186c0 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
186d0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
186e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
186f0 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68  increasing.** th
18700 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
18710 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
18720 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
18730 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
18740 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
18750 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
18760 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18770 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18780 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
18790 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42  BTS_OVERWRITE==B
187a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
187b0 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *2 );.  assert( 
187c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d  BTS_FAST_SECURE=
187d0 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c  =(BTS_OVERWRITE|
187e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
187f0 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  E) );.  if( newF
18800 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
18810 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
18820 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55  = ~BTS_FAST_SECU
18830 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e  RE;.    p->pBt->
18840 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
18850 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65  SECURE_DELETE*ne
18860 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d  wFlag;.  }.  b =
18870 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
18880 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
18890 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45  CURE)/BTS_SECURE
188a0 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74  _DELETE;.  sqlit
188b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
188c0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
188d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
188e0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
188f0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
18900 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
18910 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
18920 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
18930 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
18940 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
18950 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
18960 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
18970 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
18980 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
18990 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
189a0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
189b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
189c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
189d0 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
189e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
189f0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
18a00 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
18a10 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
18a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18a30 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
18a40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18a50 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
18a60 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18a70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18a80 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
18a90 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
18aa0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18ab0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
18ac0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18ad0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
18ae0 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
18af0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
18b00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
18b10 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
18b20 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
18b30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18b40 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
18b50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
18b60 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
18b70 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18b90 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
18ba0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18bb0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
18bc0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
18bd0 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
18be0 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
18bf0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
18c00 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
18c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18c20 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
18c30 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
18c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18c50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
18c60 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
18c70 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
18c80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
18c90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18ca0 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
18cb0 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
18cc0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
18cd0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
18ce0 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
18cf0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
18d00 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
18d10 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
18d20 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
18d30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18d40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18d50 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
18d60 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
18d70 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61  s not set the sa
18d80 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74  fety-level for t
18d90 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
18da0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67  nection.** using
18db0 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
18dc0 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68  nous", and if th
18dd0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69  e safety-level i
18de0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
18df0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
18e00 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
18e10 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65   function as the
18e20 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
18e30 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e  r,.** set it so.
18e40 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .*/.#if SQLITE_D
18e50 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
18e60 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  US!=SQLITE_DEFAU
18e70 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
18e80 55 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66  US \.    && !def
18e90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18ea0 5f 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69  _WAL).static voi
18eb0 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
18ec0 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
18ed0 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
18ee0 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
18ef0 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
18f00 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
18f10 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
18f20 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
18f30 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
18f40 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18f50 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18f60 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
18f70 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
18f80 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
18f90 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
18fa0 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
18fb0 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
18fc0 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
18fd0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
18fe0 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
18ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
19000 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
19010 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
19020 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
19030 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
19040 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
19050 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
19060 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
19070 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
19080 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
19090 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
190a0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
190b0 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
190c0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
190d0 65 28 42 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a  e(BtShared*);...
190e0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
190f0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
19100 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19110 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
19120 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
19130 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
19140 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
19150 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19160 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
19170 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
19180 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
19190 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
191a0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
191b0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
191c0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
191d0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
191e0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
191f0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
19200 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
19210 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
19220 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
19230 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
19240 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
19250 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19260 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19270 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
19280 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
19290 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
192a0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
192b0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
192c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
192d0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
192e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
192f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
19300 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
19310 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
19320 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
19330 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19340 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19350 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
19360 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
19370 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
19380 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
19390 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
193a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
193b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
193c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
193d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
193e0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
193f0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
19400 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
19410 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19420 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19430 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
19440 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
19450 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
19460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19470 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
19480 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
19490 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
194a0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
194b0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
194c0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
194d0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
194e0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
194f0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
19500 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
19510 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
19520 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19530 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19540 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
19550 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
19560 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
19570 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
19580 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
19590 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
195a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
195b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42  e;.  }.  if( (pB
195c0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
195d0 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62  QLITE_ResetDatab
195e0 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  ase)!=0 ){.    n
195f0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
19600 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
19610 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
19620 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
19630 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
19640 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
19650 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
19660 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
19670 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19680 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
19690 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
196a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
196b0 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
196c0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
196d0 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
196e0 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
196f0 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
19700 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
19710 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
19720 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
19730 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
19740 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
19750 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19760 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
19780 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
19790 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
197a0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
197b0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
197c0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
197d0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
197e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
197f0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19800 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
19810 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
19820 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
19830 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
19840 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
19850 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19860 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
19870 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19880 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
19890 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
198a0 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
198b0 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
198c0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
198d0 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
198e0 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
198f0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
19900 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
19910 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
19920 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
19930 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
19940 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
19950 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
19960 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
19970 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
19980 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
19990 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
199a0 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
199b0 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
199c0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
199d0 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
199e0 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
199f0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
19a00 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
19a10 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
19a20 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
19a30 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
19a40 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
19a50 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19a60 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
19a70 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
19a80 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
19a90 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
19aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19ab0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
19ac0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
19ad0 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
19ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19af0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19b00 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19b20 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
19b30 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
19b40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
19b50 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
19b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
19b70 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
19b80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
19b90 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
19ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19bb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
19bc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
19bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
19be0 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  DB;.    }else{. 
19bf0 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
19c00 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
19c10 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
19c20 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
19c30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
19c40 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c50 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
19c60 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
19c70 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
19c80 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
19c90 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
19ca0 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
19cb0 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
19cc0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
19cd0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
19ce0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
19cf0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
19d00 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
19d10 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
19d20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
19d30 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
19d40 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
19d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19d60 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
19d70 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
19d80 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
19d90 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19da0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
19db0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19dc0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
19dd0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
19de0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
19df0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
19e00 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
19e10 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
19e20 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
19e30 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
19e40 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
19e50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
19e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
19e70 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
19e80 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
19e90 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
19ea0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
19eb0 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
19ec0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
19ed0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
19ee0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
19ef0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
19f00 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
19f10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
19f20 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
19f30 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
19f40 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
19f50 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
19f60 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
19f70 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
19f80 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19f90 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19fa0 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  .    pBt->btsFla
19fb0 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49  gs |= BTS_PAGESI
19fc0 5a 45 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73  ZE_FIXED;.    as
19fd0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
19fe0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
19ff0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a000 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
1a010 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
1a020 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
1a030 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
1a040 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
1a050 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
1a060 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
1a070 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
1a080 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
1a090 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
1a0a0 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
1a0b0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
1a0c0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
1a0d0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
1a0e0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
1a0f0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
1a100 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
1a110 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
1a120 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
1a130 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1a140 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
1a150 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a160 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
1a170 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
1a180 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
1a190 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
1a1a0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
1a1b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1a1c0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
1a1d0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
1a1e0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1a1f0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
1a200 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
1a210 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
1a220 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
1a230 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
1a240 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
1a250 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
1a260 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
1a270 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
1a280 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1a290 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
1a2a0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
1a2b0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
1a2c0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
1a2d0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
1a2e0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
1a2f0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
1a300 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
1a310 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1a320 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1a330 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
1a340 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
1a350 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
1a360 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1a370 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
1a380 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
1a390 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1a3a0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
1a3b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
1a3c0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
1a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a3f0 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
1a400 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
1a410 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1a420 69 66 28 20 73 71 6c 69 74 65 33 57 72 69 74 61  if( sqlite3Writa
1a430 62 6c 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64  bleSchema(pBt->d
1a440 62 29 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e  b)==0 && nPage>n
1a450 50 61 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20  PageFile ){.    
1a460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1a470 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1a480 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
1a490 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
1a4a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a4b0 4f 46 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30  OF: R-28312-6470
1a4c0 34 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75  4 However, the u
1a4d0 73 61 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f  sable size is no
1a4e0 74 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20  t allowed to.   
1a4f0 20 2a 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e   ** be less than
1a500 20 34 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77   480. In other w
1a510 6f 72 64 73 2c 20 69 66 20 74 68 65 20 70 61 67  ords, if the pag
1a520 65 20 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74  e size is 512, t
1a530 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
1a540 65 73 65 72 76 65 64 20 73 70 61 63 65 20 73 69  eserved space si
1a550 7a 65 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64  ze cannot exceed
1a560 20 33 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   32. */.    if( 
1a570 75 73 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29  usableSize<480 )
1a580 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
1a590 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
1a5a0 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
1a5b0 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  ageSize = pageSi
1a5c0 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
1a5d0 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1a5e0 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  Size;.#ifndef SQ
1a5f0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1a600 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75  CUUM.    pBt->au
1a610 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
1a620 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
1a630 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20   4*4])?1:0);.   
1a640 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1a650 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
1a660 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31  ge1[36 + 7*4])?1
1a670 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  :0);.#endif.  }.
1a680 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69  .  /* maxLocal i
1a690 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d  s the maximum am
1a6a0 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
1a6b0 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
1a6c0 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c   for.  ** a cell
1a6d0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20  .  Make sure it 
1a6e0 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  is small enough 
1a6f0 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61 73 74  so that at least
1a700 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20   minFanout.  ** 
1a710 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66  cells can will f
1a720 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20  it on one page. 
1a730 20 57 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d   We assume a 10-
1a740 62 79 74 65 20 70 61 67 65 20 68 65 61 64 65 72  byte page header
1a750 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74  ..  ** Besides t
1a760 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20  he payload, the 
1a770 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a  cell must store:
1a780 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65  .  **     2-byte
1a790 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1a7a0 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d  cell.  **     4-
1a7b0 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74  byte child point
1a7c0 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79  er.  **     9-by
1a7d0 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20  te nKey value.  
1a7e0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44  **     4-byte nD
1a7f0 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  ata value.  **  
1a800 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c     4-byte overfl
1a810 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a  ow page pointer.
1a820 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63    ** So a cell c
1a830 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62  onsists of a 2-b
1a840 79 74 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68  yte pointer, a h
1a850 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20 61  eader which is a
1a860 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31  s much as.  ** 1
1a870 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20  7 bytes long, 0 
1a880 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61  to N bytes of pa
1a890 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70  yload, and an op
1a8a0 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76  tional 4 byte ov
1a8b0 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65  erflow.  ** page
1a8c0 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20   pointer..  */. 
1a8d0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d   pBt->maxLocal =
1a8e0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
1a8f0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
1a900 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
1a910 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >minLocal = (u16
1a920 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1a930 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
1a940 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c  23);.  pBt->maxL
1a950 65 61 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d  eaf = (u16)(pBt-
1a960 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
1a970 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61  );.  pBt->minLea
1a980 66 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  f = (u16)((pBt->
1a990 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
1a9a0 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69  2/255 - 23);.  i
1a9b0 66 28 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  f( pBt->maxLocal
1a9c0 3e 31 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d  >127 ){.    pBt-
1a9d0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1a9e0 20 3d 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b   = 127;.  }else{
1a9f0 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
1aa00 74 65 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29  tePayload = (u8)
1aa10 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
1aa20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
1aa30 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c  ->maxLeaf + 23 <
1aa40 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  = MX_CELL_SIZE(p
1aa50 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50  Bt) );.  pBt->pP
1aa60 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20  age1 = pPage1;. 
1aa70 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
1aa80 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  age;.  return SQ
1aa90 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f  LITE_OK;..page1_
1aaa0 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72  init_failed:.  r
1aab0 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1aac0 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
1aad0 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
1aae0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1aaf0 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52  f NDEBUG./*.** R
1ab00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1ab10 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e   of cursors open
1ab20 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73   on pBt. This is
1ab30 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
1ab40 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
1ab50 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
1ab60 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
1ab70 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
1ab80 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  defined..**.** O
1ab90 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72  nly write cursor
1aba0 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66  s are counted if
1abb0 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e   wrOnly is true.
1abc0 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a    If wrOnly is.*
1abd0 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c  * false then all
1abe0 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1abf0 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  nted..**.** For 
1ac00 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
1ac10 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
1ac20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75  cursor is any cu
1ac30 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20  rsor that.** is 
1ac40 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69  capable of readi
1ac50 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  ng or writing to
1ac60 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1ac70 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20  Cursors that.** 
1ac80 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70 65  have been trippe
1ac90 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f  d into the CURSO
1aca0 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61 72  R_FAULT state ar
1acb0 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a  e not counted..*
1acc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
1acd0 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42  ntValidCursors(B
1ace0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e  tShared *pBt, in
1acf0 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  t wrOnly){.  BtC
1ad00 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
1ad10 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
1ad20 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
1ad30 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
1ad40 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
1ad50 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c  if( (wrOnly==0 |
1ad60 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  | (pCur->curFlag
1ad70 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
1ad80 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20  ag)!=0).     && 
1ad90 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
1ada0 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
1adb0 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
1adc0 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
1add0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
1ade0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
1adf0 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
1ae00 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
1ae10 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
1ae20 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
1ae30 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
1ae40 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1ae50 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
1ae60 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
1ae70 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1ae80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ae90 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
1aea0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
1aeb0 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
1aec0 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
1aed0 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73  there is a trans
1aee0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
1aef0 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ss, this routine
1af00 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1af10 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f  static void unlo
1af20 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1af30 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
1af40 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1af50 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
1af60 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1af70 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
1af80 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d  Cursors(pBt,0)==
1af90 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e  0 || pBt->inTran
1afa0 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f  saction>TRANS_NO
1afb0 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  NE );.  if( pBt-
1afc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1afd0 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42  TRANS_NONE && pB
1afe0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a  t->pPage1!=0 ){.
1aff0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1b000 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
1b010 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  1;.    assert( p
1b020 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
1b030 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
1b040 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1b050 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31  (pBt->pPager)==1
1b060 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   );.    pBt->pPa
1b070 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  ge1 = 0;.    rel
1b080 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1b090 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e1);.  }.}../*.*
1b0a0 2a 20 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20  * If pBt points 
1b0b0 74 6f 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  to an empty file
1b0c0 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68   then convert th
1b0d0 61 74 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a  at empty file.**
1b0e0 20 69 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74   into a new empt
1b0f0 79 20 64 61 74 61 62 61 73 65 20 62 79 20 69 6e  y database by in
1b100 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66  itializing the f
1b110 69 72 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20  irst page of.** 
1b120 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  the database..*/
1b130 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44  .static int newD
1b140 61 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64  atabase(BtShared
1b150 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
1b160 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e  e *pP1;.  unsign
1b170 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20  ed char *data;. 
1b180 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1b190 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b1a0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1b1b0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
1b1c0 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
1b1d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b1e0 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42  ;.  }.  pP1 = pB
1b1f0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73  t->pPage1;.  ass
1b200 65 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20  ert( pP1!=0 );. 
1b210 20 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61   data = pP1->aDa
1b220 74 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ta;.  rc = sqlit
1b230 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31  e3PagerWrite(pP1
1b240 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
1b250 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1b260 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c  ;.  memcpy(data,
1b270 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73   zMagicHeader, s
1b280 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
1b290 65 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er));.  assert( 
1b2a0 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61  sizeof(zMagicHea
1b2b0 64 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61  der)==16 );.  da
1b2c0 74 61 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70  ta[16] = (u8)((p
1b2d0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29  Bt->pageSize>>8)
1b2e0 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31  &0xff);.  data[1
1b2f0 37 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  7] = (u8)((pBt->
1b300 70 61 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78  pageSize>>16)&0x
1b310 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20  ff);.  data[18] 
1b320 3d 20 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20  = 1;.  data[19] 
1b330 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 1;.  assert( p
1b340 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d  Bt->usableSize<=
1b350 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26  pBt->pageSize &&
1b360 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1b370 2b 32 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53  +255>=pBt->pageS
1b380 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d  ize);.  data[20]
1b390 20 3d 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67   = (u8)(pBt->pag
1b3a0 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
1b3b0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  bleSize);.  data
1b3c0 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74  [21] = 64;.  dat
1b3d0 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61  a[22] = 32;.  da
1b3e0 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d  ta[23] = 32;.  m
1b3f0 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c  emset(&data[24],
1b400 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a   0, 100-24);.  z
1b410 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46  eroPage(pP1, PTF
1b420 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
1b430 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b  |PTF_LEAFDATA );
1b440 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  .  pBt->btsFlags
1b450 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1b460 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
1b470 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b480 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28  VACUUM.  assert(
1b490 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1b4a0 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f  ==1 || pBt->auto
1b4b0 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61  Vacuum==0 );.  a
1b4c0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72  ssert( pBt->incr
1b4d0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
1b4e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20  ->incrVacuum==0 
1b4f0 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
1b500 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70  ata[36 + 4*4], p
1b510 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
1b520 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1b530 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74  a[36 + 7*4], pBt
1b540 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23  ->incrVacuum);.#
1b550 65 6e 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61  endif.  pBt->nPa
1b560 67 65 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33  ge = 1;.  data[3
1b570 31 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  1] = 1;.  return
1b580 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1b590 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
1b5a0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
1b5b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1b5c0 69 6c 65 20 28 63 72 65 61 74 69 6e 67 20 61 20  ile (creating a 
1b5d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73  database.** cons
1b5e0 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67  isting of a sing
1b5f0 6c 65 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73  le page and no s
1b600 63 68 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20  chema objects). 
1b610 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b620 0a 2a 2a 20 69 66 20 73 75 63 63 65 73 73 66 75  .** if successfu
1b630 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
1b640 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
1b650 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wise..*/.int sql
1b660 69 74 65 33 42 74 72 65 65 4e 65 77 44 62 28 42  ite3BtreeNewDb(B
1b670 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
1b680 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
1b690 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
1b6a0 3e 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b  >pBt->nPage = 0;
1b6b0 0a 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62  .  rc = newDatab
1b6c0 61 73 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73  ase(p->pBt);.  s
1b6d0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1b6e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1b6f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
1b700 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
1b710 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
1b720 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b730 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
1b740 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
1b750 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
1b760 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
1b770 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
1b780 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
1b790 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
1b7a0 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
1b7b0 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
1b7c0 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
1b7d0 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
1b7e0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
1b7f0 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
1b800 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
1b810 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
1b820 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
1b830 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
1b840 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
1b850 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
1b860 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
1b870 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
1b880 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
1b890 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
1b8a0 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
1b8b0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
1b8c0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1b8d0 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
1b8e0 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
1b8f0 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
1b900 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1b910 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
1b920 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
1b930 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
1b940 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
1b950 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
1b960 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
1b970 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1b980 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
1b990 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1b9a0 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
1b9b0 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1b9c0 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
1b9d0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1b9e0 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
1b9f0 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
1ba00 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
1ba10 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1ba20 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
1ba30 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1ba40 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
1ba50 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
1ba60 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
1ba70 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
1ba80 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
1ba90 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
1baa0 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
1bab0 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
1bac0 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
1bad0 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1bae0 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
1baf0 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
1bb00 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
1bb10 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
1bb20 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
1bb30 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
1bb40 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
1bb50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
1bb60 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
1bb70 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1bb80 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
1bb90 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1bba0 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
1bbb0 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
1bbc0 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
1bbd0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
1bbe0 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
1bbf0 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
1bc00 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
1bc10 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
1bc20 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
1bc30 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
1bc40 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
1bc50 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
1bc60 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
1bc70 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
1bc80 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
1bc90 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
1bca0 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
1bcb0 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
1bcc0 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
1bcd0 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
1bce0 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
1bcf0 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
1bd00 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
1bd10 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
1bd20 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
1bd30 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
1bd40 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1bd50 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
1bd60 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
1bd70 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
1bd80 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
1bd90 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
1bda0 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
1bdb0 2c 20 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e  , int wrflag, in
1bdc0 74 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f  t *pSchemaVersio
1bdd0 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  n){.  BtShared *
1bde0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1bdf0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1be00 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1be10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1be20 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1be30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1be40 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1be50 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1be60 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1be70 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1be80 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1be90 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1bea0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1beb0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1bec0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1bed0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1bee0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1bef0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1bf00 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1bf10 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1bf20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1bf30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1bf40 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1bf50 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1bf60 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1bf70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1bf80 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70  ==0 );..  if( (p
1bf90 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1bfa0 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61  LITE_ResetDataba
1bfb0 73 65 29 20 0a 20 20 20 26 26 20 73 71 6c 69 74  se) .   && sqlit
1bfc0 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
1bfd0 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  y(pBt->pPager)==
1bfe0 30 20 0a 20 20 29 7b 0a 20 20 20 20 70 42 74 2d  0 .  ){.    pBt-
1bff0 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54  >btsFlags &= ~BT
1c000 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d  S_READ_ONLY;.  }
1c010 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
1c020 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
1c030 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
1c040 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
1c050 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74  se */.  if( (pBt
1c060 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1c070 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26  _READ_ONLY)!=0 &
1c080 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1c090 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
1c0a0 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74  ONLY;.    goto t
1c0b0 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
1c0c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1c0d0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1c0e0 45 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  E.  {.    sqlite
1c0f0 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
1c100 20 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72     /* If another
1c110 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1c120 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65   has already ope
1c130 6e 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e  ned a write tran
1c140 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  saction .    ** 
1c150 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
1c160 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
1c170 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
1c180 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1c190 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65  .    ** requeste
1c1a0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
1c1b0 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a  _LOCKED..    */.
1c1c0 20 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20      if( (wrflag 
1c1d0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1c1e0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1c1f0 54 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74  TE).     || (pBt
1c200 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1c210 5f 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20  _PENDING)!=0.   
1c220 20 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b   ){.      pBlock
1c230 20 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d   = pBt->pWriter-
1c240 3e 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  >db;.    }else i
1c250 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20  f( wrflag>1 ){. 
1c260 20 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74       BtLock *pIt
1c270 65 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49  er;.      for(pI
1c280 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
1c290 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
1c2a0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1c2b0 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
1c2c0 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
1c2d0 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70        pBlock = p
1c2e0 49 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  Iter->pBtree->db
1c2f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c300 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1c310 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1c320 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
1c330 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
1c340 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
1c350 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
1c360 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
1c370 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
1c380 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61  ;.      goto tra
1c390 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a  ns_begun;.    }.
1c3a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1c3b0 20 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f   Any read-only o
1c3c0 72 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61  r read-write tra
1c3d0 6e 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73  nsaction implies
1c3e0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
1c3f0 0a 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f  .  ** page 1. So
1c400 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73   if some other s
1c410 68 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65  hared-cache clie
1c420 6e 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61  nt already has a
1c430 20 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a   write-lock .  *
1c440 2a 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  * on page 1, the
1c450 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e   transaction can
1c460 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a  not be opened. *
1c470 2f 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68  /.  rc = querySh
1c480 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1c490 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f  ck(p, MASTER_ROO
1c4a0 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20  T, READ_LOCK);. 
1c4b0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1c4c0 72 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f  rc ) goto trans_
1c4d0 62 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62  begun;..  pBt->b
1c4e0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1c4f0 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1c500 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
1c510 65 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46  e==0 ) pBt->btsF
1c520 6c 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54  lags |= BTS_INIT
1c530 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64  IALLY_EMPTY;.  d
1c540 6f 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20  o {.    /* Call 
1c550 6c 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69  lockBtree() unti
1c560 6c 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50  l either pBt->pP
1c570 61 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65  age1 is populate
1c580 64 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  d or.    ** lock
1c590 42 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20  Btree() returns 
1c5a0 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
1c5b0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  than SQLITE_OK. 
1c5c0 6c 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20  lockBtree().    
1c5d0 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
1c5e0 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1c5f0 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65  e pBt->pPage1 se
1c600 74 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a  t to 0 if after.
1c610 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70      ** reading p
1c620 61 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65  age 1 it discove
1c630 72 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  rs that the page
1c640 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74  -size of the dat
1c650 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69  abase .    ** fi
1c660 6c 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70  le is not pBt->p
1c670 61 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73  ageSize. In this
1c680 20 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28   case lockBtree(
1c690 29 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20  ) will update.  
1c6a0 20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69    ** pBt->pageSi
1c6b0 7a 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73  ze to the page-s
1c6c0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1c6d0 6f 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a  on disk..    */.
1c6e0 20 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e      while( pBt->
1c6f0 70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c  pPage1==0 && SQL
1c700 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f  ITE_OK==(rc = lo
1c710 63 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b  ckBtree(pBt)) );
1c720 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
1c730 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1c740 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  g ){.      if( (
1c750 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
1c760 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d  BTS_READ_ONLY)!=
1c770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1c780 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1c790 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
1c7a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c7b0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1c7c0 42 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61  Bt->pPager,wrfla
1c7d0 67 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49  g>1,sqlite3TempI
1c7e0 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b  nMemory(p->db));
1c7f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1c800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c810 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77          rc = new
1c820 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
1c830 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1c840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
1c850 5f 53 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74  _SNAPSHOT && pBt
1c860 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1c870 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1c880 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74           /* if t
1c890 68 65 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e  here was no tran
1c8a0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77  saction opened w
1c8b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1c8c0 6e 20 77 61 73 0a 20 20 20 20 20 20 20 20 20 20  n was.          
1c8d0 2a 2a 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51  ** called and SQ
1c8e0 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
1c8f0 4f 54 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OT is returned, 
1c900 63 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72  change the error
1c910 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1c920 64 65 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53  de to SQLITE_BUS
1c930 59 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  Y. */.          
1c940 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1c950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c960 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1c970 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c980 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  OK ){.      unlo
1c990 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1c9a0 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
1c9b0 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d  hile( (rc&0xFF)=
1c9c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1c9d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1c9e0 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1c9f0 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72 65  &.          btre
1ca00 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
1ca10 65 72 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c  er(pBt) );.  sql
1ca20 69 74 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f  ite3PagerResetLo
1ca30 63 6b 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70  ckTimeout(pBt->p
1ca40 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72  Pager);..  if( r
1ca50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ca60 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1ca70 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns==TRANS_NONE )
1ca80 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  {.      pBt->nTr
1ca90 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66  ansaction++;.#if
1caa0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cab0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
1cac0 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61      if( p->shara
1cad0 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ble ){.        a
1cae0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70  ssert( p->lock.p
1caf0 42 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c  Btree==p && p->l
1cb00 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b  ock.iTable==1 );
1cb10 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1cb20 2e 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f  .eLock = READ_LO
1cb30 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c  CK;.        p->l
1cb40 6f 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ock.pNext = pBt-
1cb50 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  >pLock;.        
1cb60 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d  pBt->pLock = &p-
1cb70 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  >lock;.      }.#
1cb80 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
1cb90 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
1cba0 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
1cbb0 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
1cbc0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1cbd0 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
1cbe0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
1cbf0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1cc00 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
1cc10 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c    }.    if( wrfl
1cc20 61 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50  ag ){.      MemP
1cc30 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
1cc40 74 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64  t->pPage1;.#ifnd
1cc50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1cc60 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1cc70 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
1cc80 70 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20  pWriter );.     
1cc90 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
1cca0 70 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  p;.      pBt->bt
1ccb0 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45  sFlags &= ~BTS_E
1ccc0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
1ccd0 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70  if( wrflag>1 ) p
1cce0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
1ccf0 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23  BTS_EXCLUSIVE;.#
1cd00 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20  endif..      /* 
1cd10 49 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68  If the db-size h
1cd20 65 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69  eader field is i
1cd30 6e 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20  ncorrect (as it 
1cd40 6d 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64  may be if an old
1cd50 0a 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74  .      ** client
1cd60 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e   has been writin
1cd70 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1cd80 69 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20  ile), update it 
1cd90 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20  now. Doing.     
1cda0 20 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20   ** this sooner 
1cdb0 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65  rather than late
1cdc0 72 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  r means the data
1cdd0 62 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61  base size can sa
1cde0 66 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72  fely .      ** r
1cdf0 65 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62  e-read the datab
1ce00 61 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61  ase size from pa
1ce10 67 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f  ge 1 if a savepo
1ce20 69 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69  int or transacti
1ce30 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  on.      ** roll
1ce40 62 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68  back occurs with
1ce50 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
1ce60 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1ce70 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
1ce80 65 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61  e!=get4byte(&pPa
1ce90 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20  ge1->aData[28]) 
1cea0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ceb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1cec0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1ced0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1cee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1cef0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1cf00 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1cf10 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61  ta[28], pBt->nPa
1cf20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ge);.        }. 
1cf30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1cf40 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
1cf50 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cf60 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1cf70 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a  chemaVersion ){.
1cf80 20 20 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65        *pSchemaVe
1cf90 72 73 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65  rsion = get4byte
1cfa0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1cfb0 44 61 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d  Data[40]);.    }
1cfc0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1cfd0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1cfe0 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1cff0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1d000 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1d010 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
1d020 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1d030 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1d040 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1d050 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1d060 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73  d.      ** the s
1d070 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  ub-journal is no
1d080 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20  t already open, 
1d090 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20  then it will be 
1d0a0 6f 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20  opened here..   
1d0b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1d0c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
1d0d0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
1d0e0 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e  pPager, p->db->n
1d0f0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
1d100 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  }.  }..  btreeIn
1d110 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
1d120 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1d130 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1d140 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1d150 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1d160 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
1d170 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
1d180 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
1d190 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
1d1a0 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
1d1b0 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
1d1c0 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
1d1d0 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
1d1e0 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
1d1f0 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
1d200 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
1d210 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
1d220 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
1d230 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
1d240 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
1d250 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
1d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d270 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
1d280 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
1d290 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
1d2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1d2c0 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
1d2d0 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
1d2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d300 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
1d310 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1d320 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
1d330 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65  gno pgno = pPage
1d340 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  ->pgno;..  asser
1d350 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1d360 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1d370 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
1d380 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1d390 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1d3a0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1d3b0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1d3c0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1d3d0 6e 20 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20  n rc;.  nCell = 
1d3e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1d3f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1d400 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
1d410 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c  *pCell = findCel
1d420 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20  l(pPage, i);..  
1d430 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50    ptrmapPutOvflP
1d440 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
1d450 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28 20   &rc);..    if( 
1d460 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1d470 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64        Pgno child
1d480 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
1d490 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70 74  pCell);.      pt
1d4a0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1d4b0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1d4c0 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1d4d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
1d4e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d4f0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
1d500 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1d510 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1d520 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1d530 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  8]);.    ptrmapP
1d540 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1d550 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1d560 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 7d   pgno, &rc);.  }
1d570 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1d580 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
1d590 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20  e on pPage is a 
1d5a0 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
1d5b0 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74  iFrom.  Modify t
1d5c0 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a  his pointer so.*
1d5d0 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1d5e0 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74   to iTo. Paramet
1d5f0 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62  er eType describ
1d600 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70  es the type of p
1d610 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20  ointer to.** be 
1d620 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f  modified, as  fo
1d630 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52  llows:.**.** PTR
1d640 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70  MAP_BTREE:     p
1d650 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d  Page is a btree-
1d660 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1d670 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68  r points at a ch
1d680 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ild .**         
1d690 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f            page o
1d6a0 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  f pPage..**.** P
1d6b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a  TRMAP_OVERFLOW1:
1d6c0 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1d6d0 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1d6e0 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  ter points at an
1d6f0 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20   overflow.**    
1d700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d710 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  age pointed to b
1d720 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c  y one of the cel
1d730 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a  ls on pPage..**.
1d740 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
1d750 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e  OW2: pPage is an
1d760 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20   overflow-page. 
1d770 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1d780 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a  ts at the next.*
1d790 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d7a0 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67      overflow pag
1d7b0 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a  e in the list..*
1d7c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64  /.static int mod
1d7d0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d  ifyPagePointer(M
1d7e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50  emPage *pPage, P
1d7f0 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20  gno iFrom, Pgno 
1d800 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a  iTo, u8 eType){.
1d810 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d820 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1d830 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1d840 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
1d850 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
1d860 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
1d870 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54  age) );.  if( eT
1d880 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1d890 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
1d8a0 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
1d8b0 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1d8c0 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
1d8d0 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
1d8e0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
1d8f0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
1d900 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
1d910 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d920 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
1d930 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
1d940 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1d950 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
1d960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1d970 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c  i;.    int nCell
1d980 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ;.    int rc;.. 
1d990 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69     rc = pPage->i
1d9a0 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f  sInit ? SQLITE_O
1d9b0 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67  K : btreeInitPag
1d9c0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66  e(pPage);.    if
1d9d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1d9e0 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
1d9f0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
1da00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
1da10 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
1da20 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1da30 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
1da40 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1da50 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1da60 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
1da70 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
1da80 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
1da90 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
1daa0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20  l, &info);.     
1dab0 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63     if( info.nLoc
1dac0 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  al<info.nPayload
1dad0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1dae0 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  ( pCell+info.nSi
1daf0 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74  ze > pPage->aDat
1db00 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  a+pPage->pBt->us
1db10 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
1db20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1db30 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1db40 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
1db50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1db60 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34   if( iFrom==get4
1db70 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1db80 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20 20 20  nSize-4) ){.    
1db90 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1dba0 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a  (pCell+info.nSiz
1dbb0 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  e-4, iTo);.     
1dbc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1dbd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dbe0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1dbf0 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65 74  .        if( get
1dc00 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46  4byte(pCell)==iF
1dc10 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rom ){.         
1dc20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c   put4byte(pCell,
1dc30 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1dc40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1dc50 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1dc60 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43    .    if( i==nC
1dc70 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ell ){.      if(
1dc80 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42   eType!=PTRMAP_B
1dc90 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20  TREE || .       
1dca0 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61     get4byte(&pPa
1dcb0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1dcc0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d  >hdrOffset+8])!=
1dcd0 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1dce0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1dcf0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
1dd00 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1dd10 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1dd20 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1dd30 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54  hdrOffset+8], iT
1dd40 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
1dd50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dd60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1dd70 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1dd80 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1dd90 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1dda0 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1ddb0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1ddc0 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1ddd0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1dde0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1ddf0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1de00 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1de10 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1de20 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1de30 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1de40 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1de50 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1de60 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1de70 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1de80 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1de90 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1dea0 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1deb0 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1dec0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1ded0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1dee0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1def0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1df00 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1df10 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1df20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1df30 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1df40 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1df50 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1df60 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1df70 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1df80 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1df90 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1dfa0 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1dfb0 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1dfc0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1dfd0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1dfe0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1dff0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1e000 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1e010 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1e020 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1e030 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1e040 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1e050 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1e060 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1e070 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1e080 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1e090 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1e0a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1e0b0 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1e0c0 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1e0d0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1e0e0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1e0f0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1e100 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1e110 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1e120 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1e130 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1e140 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1e150 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1e160 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1e170 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1e180 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1e190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1e1a0 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1e1b0 3b 0a 20 20 69 66 28 20 69 44 62 50 61 67 65 3c  ;.  if( iDbPage<
1e1c0 33 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  3 ) return SQLIT
1e1d0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e1e0 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
1e1f0 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
1e200 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
1e210 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
1e220 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
1e230 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
1e240 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
1e250 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
1e260 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
1e270 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
1e280 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1e290 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
1e2a0 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
1e2b0 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1e2c0 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
1e2d0 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
1e2e0 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
1e2f0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1e300 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1e310 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
1e320 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
1e330 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
1e340 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
1e350 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
1e360 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
1e370 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
1e380 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
1e390 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1e3a0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
1e3b0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
1e3c0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
1e3d0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
1e3e0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
1e3f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
1e400 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1e410 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
1e420 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
1e430 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
1e440 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
1e450 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1e460 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
1e470 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1e480 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
1e490 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
1e4a0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
1e4b0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
1e4c0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
1e4d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1e4e0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1e4f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1e500 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1e510 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1e520 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1e530 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e540 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1e550 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
1e560 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
1e570 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
1e580 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
1e590 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
1e5a0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
1e5b0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
1e5c0 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
1e5d0 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
1e5e0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
1e5f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1e610 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1e620 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1e630 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
1e640 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
1e650 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
1e660 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
1e670 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
1e680 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
1e690 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
1e6a0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1e6b0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1e6c0 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
1e6d0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1e6e0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1e6f0 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1e700 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
1e710 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
1e720 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1e730 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1e750 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1e760 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1e770 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
1e780 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e790 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e7a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1e7b0 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
1e7c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1e7d0 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
1e7e0 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
1e7f0 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
1e800 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
1e810 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1e820 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
1e830 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e840 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1e850 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
1e860 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
1e870 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
1e880 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1e890 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1e8a0 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
1e8b0 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
1e8c0 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
1e8d0 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1e8e0 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
1e8f0 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
1e900 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
1e910 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
1e920 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
1e930 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
1e940 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
1e950 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
1e960 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
1e970 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
1e980 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
1e990 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
1e9a0 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
1e9b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1e9c0 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
1e9d0 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
1e9e0 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
1e9f0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
1ea00 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1ea10 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
1ea20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  specifically, th
1ea30 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
1ea40 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
1ea50 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
1ea60 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
1ea70 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
1ea80 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
1ea90 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
1eaa0 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
1eab0 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
1eac0 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
1ead0 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1eae0 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
1eaf0 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
1eb00 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1eb10 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
1eb20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1eb30 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
1eb40 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
1eb50 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1eb60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1eb70 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
1eb80 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
1eb90 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
1eba0 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
1ebb0 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1ebc0 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
1ebd0 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
1ebe0 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
1ebf0 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
1ec00 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20  acuum-on-commit 
1ec10 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
1ec20 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
1ec30 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1ec40 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
1ec50 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1ec60 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1ec70 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
1ec80 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
1ec90 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
1eca0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
1ecb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1ecc0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
1ecd0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
1ece0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1ecf0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1ed00 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1ed10 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1ed20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
1ed30 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
1ed40 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1ed50 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
1ed60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1ed70 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
1ed80 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
1ed90 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
1eda0 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
1edb0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1edc0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1edd0 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
1ede0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1edf0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
1ee00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1ee10 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1ee20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
1ee30 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
1ee40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ee50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1ee60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1ee70 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1ee80 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1ee90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1eea0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1eeb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1eec0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1eed0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1eee0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1eef0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
1ef00 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
1ef10 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
1ef20 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
1ef30 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
1ef40 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
1ef50 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
1ef60 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
1ef70 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
1ef80 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
1ef90 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1efa0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1efb0 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
1efc0 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
1efd0 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
1efe0 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
1eff0 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
1f000 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
1f010 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1f020 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
1f030 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1f040 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1f050 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f060 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1f070 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
1f080 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
1f090 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
1f0a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1f0b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1f0c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1f0d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1f0e0 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
1f0f0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
1f100 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1f110 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f120 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
1f130 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
1f140 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1f150 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
1f160 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
1f170 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
1f180 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
1f190 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
1f1a0 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
1f1b0 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
1f1c0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1f1d0 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
1f1e0 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
1f1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
1f200 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
1f210 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1f220 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
1f230 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1f240 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1f250 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
1f260 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f280 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f290 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1f2a0 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
1f2b0 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
1f2c0 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
1f2d0 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
1f2e0 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
1f2f0 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
1f300 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
1f310 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
1f320 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
1f330 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
1f340 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
1f350 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
1f360 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1f370 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
1f380 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
1f390 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
1f3a0 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
1f3b0 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
1f3c0 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
1f3d0 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
1f3e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
1f3f0 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1f400 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
1f410 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
1f420 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
1f430 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
1f440 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1f450 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1f460 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1f470 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1f480 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1f490 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
1f4a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1f4b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f4c0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1f4d0 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1f4e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f4f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1f500 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1f510 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1f520 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
1f530 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
1f540 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
1f550 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
1f560 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
1f570 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
1f580 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
1f590 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
1f5a0 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
1f5b0 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
1f5c0 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1f5d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1f5e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f5f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f600 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f610 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
1f620 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
1f630 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
1f640 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
1f650 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
1f660 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
1f670 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1f680 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
1f690 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1f6a0 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
1f6b0 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
1f6c0 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
1f6d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f6e0 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
1f6f0 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
1f700 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1f710 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
1f720 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
1f730 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
1f740 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
1f750 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
1f760 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
1f770 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
1f780 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1f790 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
1f7a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
1f7b0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
1f7c0 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
1f7d0 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
1f7e0 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
1f7f0 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
1f800 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f820 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1f830 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
1f840 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
1f850 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
1f860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1f870 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
1f880 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
1f890 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
1f8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8b0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1f8c0 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
1f8d0 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
1f8e0 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
1f8f0 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
1f900 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
1f910 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
1f920 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
1f930 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
1f940 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
1f950 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
1f960 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
1f970 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
1f980 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f990 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1f9a0 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
1f9b0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
1f9c0 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
1f9d0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f9e0 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1f9f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1fa00 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
1fa10 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1fa20 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
1fa30 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1fa40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1fa50 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
1fa60 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
1fa70 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
1fa80 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1fa90 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
1faa0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1fab0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
1fac0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1fad0 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
1fae0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
1faf0 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
1fb00 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
1fb10 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1fb20 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
1fb30 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1fb40 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
1fb50 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1fb60 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1fb70 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
1fb80 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1fb90 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1fba0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1fbb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1fbc0 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1fbd0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1fbe0 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1fbf0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
1fc00 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1fc10 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
1fc20 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1fc30 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1fc40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1fc50 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
1fc60 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1fc70 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
1fc80 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1fc90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1fca0 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
1fcb0 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1fcc0 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1fcd0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
1fce0 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
1fcf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1fd00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
1fd10 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
1fd20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1fd30 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1fd40 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1fd50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1fd60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
1fd70 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1fd80 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
1fd90 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1fda0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1fdb0 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
1fdc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1fdd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1fde0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1fdf0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fe00 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1fe10 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1fe20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1fe30 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1fe40 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1fe50 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1fe60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1fe70 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1fe80 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1fe90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1fea0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1feb0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1fec0 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
1fed0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1fee0 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
1fef0 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
1ff00 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
1ff10 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1ff20 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
1ff30 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1ff40 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
1ff50 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
1ff60 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1ff70 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1ff80 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1ff90 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
1ffa0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
1ffb0 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
1ffc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1ffd0 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
1ffe0 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
1fff0 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
20000 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
20010 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
20020 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
20030 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
20040 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
20050 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
20060 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
20070 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
20080 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
20090 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
200a0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
200b0 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71   )..  assert( sq
200c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
200d0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
200e0 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
200f0 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
20100 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
20110 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
20120 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
20130 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
20140 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
20150 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
20160 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
20170 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
20180 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
20190 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
201a0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
201b0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
201c0 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
201d0 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
201e0 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
201f0 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
20200 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
20210 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
20220 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
20230 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
20240 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
20250 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
20260 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
20270 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
20280 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
20290 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
202a0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
202b0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
202c0 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
202d0 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
202e0 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
202f0 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
20300 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
20310 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
20320 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
20330 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
20340 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
20350 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
20360 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
20370 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
20380 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20390 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
203a0 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
203b0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
203c0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
203d0 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
203e0 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
203f0 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
20400 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
20410 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20420 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
20430 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
20440 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
20450 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
20460 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
20470 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
20480 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
20490 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
204a0 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
204b0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
204c0 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
204d0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
204e0 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
204f0 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
20500 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
20510 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20520 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20530 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
20540 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
20550 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
20560 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20570 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
20580 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20590 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
205a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
205b0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
205c0 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
205d0 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
205e0 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
205f0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
20600 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
20610 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
20620 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20630 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
20640 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
20650 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
20660 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
20670 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
20680 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
20690 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
206a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
206b0 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
206c0 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
206d0 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
206e0 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
206f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
20700 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
20710 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
20720 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
20730 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
20740 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
20750 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
20760 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
20770 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
20780 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
20790 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
207a0 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
207b0 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
207c0 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
207d0 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
207e0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
207f0 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
20800 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
20810 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
20820 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
20830 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
20840 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
20850 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
20860 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
20870 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
20880 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
20890 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
208a0 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
208b0 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
208c0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
208d0 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
208e0 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
208f0 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
20900 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
20910 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
20920 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
20930 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
20940 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
20950 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
20960 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
20970 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
20980 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20990 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
209a0 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
209b0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
209c0 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
209d0 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
209e0 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
209f0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
20a00 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
20a10 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
20a20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
20a30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20a40 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
20a50 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
20a60 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
20a70 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
20a80 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
20a90 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
20aa0 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
20ab0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
20ac0 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
20ad0 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
20ae0 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
20af0 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
20b00 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
20b10 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
20b20 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
20b30 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
20b40 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
20b50 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
20b60 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
20b70 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
20b80 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
20b90 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
20ba0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
20bb0 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
20bc0 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
20bd0 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
20be0 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
20bf0 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
20c00 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
20c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
20c20 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
20c30 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
20c40 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
20c50 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
20c60 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
20c70 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
20c80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20c90 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
20ca0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
20cb0 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
20cc0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20cd0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20ce0 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
20cf0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
20d00 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
20d10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
20d20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
20d30 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
20d40 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
20d50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
20d70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
20d80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20da0 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
20db0 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
20dc0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20dd0 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
20de0 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
20df0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
20e00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20e10 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
20e20 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
20e30 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
20e40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
20e50 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
20e60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20e70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
20e80 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
20e90 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
20ea0 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
20eb0 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
20ec0 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
20ed0 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
20ee0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
20ef0 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
20f00 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
20f10 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
20f20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20f30 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
20f40 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
20f50 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
20f60 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
20f70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20f80 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
20f90 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
20fa0 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
20fb0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
20fc0 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
20fd0 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
20fe0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
20ff0 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
21000 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
21010 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
21020 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
21030 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
21040 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
21050 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
21060 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
21070 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
21080 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
21090 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
210a0 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
210b0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
210c0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
210d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
210e0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
210f0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
21100 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
21110 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
21120 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
21130 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
21140 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
21150 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
21160 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
21170 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
21180 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
21190 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
211a0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
211b0 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
211c0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
211d0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
211e0 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
211f0 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
21200 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
21210 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
21220 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
21230 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21240 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
21250 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
21260 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
21270 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21280 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
21290 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
212a0 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
212b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
212c0 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
212d0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
212e0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
212f0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
21300 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
21310 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
21320 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
21330 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
21340 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
21350 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
21360 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
21370 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
21380 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
21390 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
213a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
213b0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
213c0 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
213d0 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
213e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
213f0 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
21400 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
21410 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
21420 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
21430 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
21440 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
21450 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
21460 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
21470 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
21480 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
21490 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
214a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
214b0 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
214c0 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
214d0 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
214e0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
214f0 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
21500 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
21510 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
21520 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
21530 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
21540 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
21550 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
21560 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
21570 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
21580 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
21590 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
215a0 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
215b0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
215c0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
215d0 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
215e0 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
215f0 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
21600 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
21610 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
21620 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
21630 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
21640 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
21650 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
21660 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
21670 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
21680 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
21690 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
216a0 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
216b0 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
216c0 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
216d0 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
216e0 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
216f0 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
21700 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
21710 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
21720 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
21730 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
21740 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
21750 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
21760 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
21770 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
21780 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
21790 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
217a0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
217b0 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
217c0 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
217d0 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
217e0 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
217f0 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
21800 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
21810 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
21820 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
21830 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
21840 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
21850 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
21860 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
21870 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
21880 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
21890 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
218a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
218b0 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
218c0 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
218d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
218e0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
218f0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
21900 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
21910 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
21920 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21930 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
21940 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
21950 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
21960 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
21970 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
21980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21990 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
219a0 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
219b0 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
219c0 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
219d0 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
219e0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
219f0 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
21a00 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
21a10 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
21a20 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
21a30 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
21a40 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
21a50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
21a60 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
21a70 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
21a80 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
21a90 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
21aa0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
21ab0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
21ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
21ad0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
21ae0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21af0 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
21b00 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
21b10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21b20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
21b30 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
21b40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
21b50 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
21b60 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21b70 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f    p->iDataVersio
21b80 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73  n--;  /* Compens
21b90 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e  ate for pPager->
21ba0 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20  iDataVersion++; 
21bb0 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  */.    pBt->inTr
21bc0 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
21bd0 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
21be0 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
21bf0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
21c00 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
21c10 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
21c20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
21c50 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
21c60 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
21c70 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21c80 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
21c90 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
21ca0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21cb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
21cc0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
21cd0 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
21ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21cf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
21d00 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
21d10 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
21d20 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21d30 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
21d40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
21d50 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
21d60 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
21d70 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
21d80 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
21d90 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
21da0 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20  y cursor on any 
21db0 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
21dc0 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
21dd0 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77  es.  Or if the w
21de0 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
21df0 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20   set to 1, then 
21e00 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69  only.** trip wri
21e10 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c  te cursors and l
21e20 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  eave read cursor
21e30 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
21e40 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
21e50 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
21e60 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e  o be tripped, in
21e70 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a  cluding cursors.
21e80 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ** that belong t
21e90 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
21ea0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
21eb0 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a  t happen to be.*
21ec0 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61  * sharing the ca
21ed0 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
21ee0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
21ef0 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
21f00 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
21f10 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77  occurs. If the w
21f20 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67  riteOnly.** flag
21f30 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
21f40 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72  nly write-cursor
21f50 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65  s need be trippe
21f60 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a  d - read-only.**
21f70 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68   cursors save th
21f80 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69  eir current posi
21f90 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
21fa0 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20  ey may continue 
21fb0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
21fc0 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20  e rollback. Or, 
21fd0 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
21fe0 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f  false, all curso
21ff0 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70  rs are .** tripp
22000 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20  ed. In general, 
22010 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
22020 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  se if the transa
22030 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ction being.** r
22040 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66  olled back modif
22050 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
22060 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73   schema. In this
22070 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f   case b-tree roo
22080 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62  t.** pages may b
22090 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74  e moved or delet
220a0 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
220b0 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c  base altogether,
220c0 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e   making.** it un
220d0 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75  safe for read cu
220e0 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75  rsors to continu
220f0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
22100 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
22110 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72  s true and an er
22120 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
22130 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76  ed while .** sav
22140 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
22150 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65  position of a re
22160 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
22170 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a  all cursors, .**
22180 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72   including all r
22190 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20  ead-cursors are 
221a0 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  tripped..**.** S
221b0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
221c0 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
221d0 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ul, or if an err
221e0 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
221f0 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73  ** saving a curs
22200 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20  or position, an 
22210 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
22220 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22230 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
22240 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
22250 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  ee, int errCode,
22260 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
22270 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
22280 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
22290 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
222a0 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c   (writeOnly==0 |
222b0 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20  | writeOnly==1) 
222c0 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61  && BTCF_WriteFla
222d0 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42  g==1 );.  if( pB
222e0 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
222f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
22300 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  tree);.    for(p
22310 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22320 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22330 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
22340 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70   writeOnly && (p
22350 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
22360 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20  F_WriteFlag)==0 
22370 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
22380 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
22390 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74  _VALID || p->eSt
223a0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
223b0 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  NEXT ){.        
223c0 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
223d0 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20  rPosition(p);.  
223e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
223f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22400 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73           (void)s
22410 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
22420 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65  llCursors(pBtree
22430 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20  , rc, 0);.      
22440 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22450 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22460 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
22470 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
22480 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
22490 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65  p);.        p->e
224a0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
224b0 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d  AULT;.        p-
224c0 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43  >skipNext = errC
224d0 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ode;.      }.   
224e0 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
224f0 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 29  llCursorPages(p)
22500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22510 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
22520 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
22530 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22540 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
22550 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
22560 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
22570 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
22580 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
22590 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
225a0 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
225b0 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
225c0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
225d0 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
225e0 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
225f0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
22600 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
22610 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
22620 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
22630 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
22640 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
22650 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
22660 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
22670 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
22680 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
22690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
226a0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
226b0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
226c0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
226d0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
226e0 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
226f0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
22700 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
22710 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
22720 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
22730 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
22740 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
22750 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
22760 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
22770 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
22780 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
22790 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
227a0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
227b0 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
227c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
227d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
227e0 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
227f0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
22800 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
22810 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
22820 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
22830 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
22840 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
22850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
22860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
22870 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
22880 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
22890 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
228a0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
228b0 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
228c0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
228d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
228e0 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
228f0 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
22900 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
22910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
22920 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
22930 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
22940 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
22950 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
22960 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
22970 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
22980 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
22990 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
229a0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
229b0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
229c0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
229d0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
229e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
229f0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
22a00 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
22a10 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
22a20 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
22a30 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
22a40 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
22a50 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
22a60 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
22a70 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
22a80 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
22a90 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
22aa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
22ab0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
22ac0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
22ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22ae0 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
22af0 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
22b00 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
22b10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
22b20 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
22b30 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
22b40 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
22b50 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
22b60 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
22b70 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
22b80 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
22b90 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
22ba0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
22bb0 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70  releasePageOne(p
22bc0 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20  Page1);.    }.  
22bd0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
22be0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
22bf0 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42   1)==0 );.    pB
22c00 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
22c10 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
22c20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
22c30 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
22c40 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
22c50 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
22c60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
22c70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
22c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74  ;.}../*.** Start
22c90 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
22ca0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
22cb0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
22cc0 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a  can be rolled.**
22cd0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
22ce0 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
22cf0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75  transaction. You
22d00 20 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   must start a tr
22d10 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65  ansaction .** be
22d20 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
22d30 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
22d40 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69  The subtransacti
22d50 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f  on is ended auto
22d60 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66  matically .** if
22d70 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
22d80 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72  ction commits or
22d90 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
22da0 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62  ** Statement sub
22db0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
22dc0 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64   used around ind
22dd0 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74  ividual SQL stat
22de0 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61  ements.** that a
22df0 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  re contained wit
22e00 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f  hin a BEGIN...CO
22e10 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20  MMIT block.  If 
22e20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20  a constraint.** 
22e30 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
22e40 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hin the statemen
22e50 74 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66  t, the effect of
22e60 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d   that one statem
22e70 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f  ent.** can be ro
22e80 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75  lled back withou
22e90 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c  t having to roll
22ea0 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20  back the entire 
22eb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
22ec0 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73  ** A statement s
22ed0 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ub-transaction i
22ee0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
22ef0 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61   an anonymous sa
22f00 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20  vepoint. The.** 
22f10 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
22f20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
22f30 65 74 65 72 20 69 73 20 74 68 65 20 74 6f 74 61  eter is the tota
22f40 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65  l number of save
22f50 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75  points,.** inclu
22f60 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f  ding the new ano
22f70 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74  nymous savepoint
22f80 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d  , open on the B-
22f90 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68  Tree. i.e. if th
22fa0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
22fb0 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
22fc0 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61  and no other sta
22fd0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
22fe0 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74  ons open,.** iSt
22ff0 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68  atement is 1. Th
23000 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  is anonymous sav
23010 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65  epoint can be re
23020 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64  leased or rolled
23030 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74   back.** using t
23040 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
23050 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74  avepoint() funct
23060 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
23070 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d  te3BtreeBeginStm
23080 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
23090 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69  iStatement){.  i
230a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
230b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
230c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
230d0 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
230e0 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  t( p->inTrans==T
230f0 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
23100 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74  assert( (pBt->bt
23110 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
23120 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20  D_ONLY)==0 );.  
23130 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
23140 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  nt>0 );.  assert
23150 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e  ( iStatement>p->
23160 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  db->nSavepoint )
23170 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
23180 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
23190 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
231a0 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67 65 72   /* At the pager
231b0 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d   level, a statem
231c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
231d0 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77  is a savepoint w
231e0 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ith.  ** an inde
231f0 78 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  x greater than a
23200 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72  ll savepoints cr
23210 65 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79  eated explicitly
23220 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20   using.  ** SQL 
23230 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69  statements. It i
23240 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65  s illegal to ope
23250 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  n, release or ro
23260 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20  llback any.  ** 
23270 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20  such savepoints 
23280 77 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d  while the statem
23290 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
232a0 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74  savepoint is act
232b0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ive..  */.  rc =
232c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
232d0 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  nSavepoint(pBt->
232e0 70 50 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65  pPager, iStateme
232f0 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nt);.  sqlite3Bt
23300 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
23310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23320 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  ** The second ar
23330 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
23340 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20  unction, op, is 
23350 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54  always SAVEPOINT
23360 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20  _ROLLBACK.** or 
23370 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
23380 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  E. This function
23390 20 65 69 74 68 65 72 20 72 65 6c 65 61 73 65 73   either releases
233a0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74   or rolls back t
233b0 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20  he.** savepoint 
233c0 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61  identified by pa
233d0 72 61 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69  rameter iSavepoi
233e0 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  nt, depending on
233f0 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f   the value .** o
23400 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d  f op..**.** Norm
23410 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74  ally, iSavepoint
23420 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
23430 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
23440 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f  o. However, if o
23450 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e  p is.** SAVEPOIN
23460 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
23470 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20   iSavepoint may 
23480 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74  also be -1. In t
23490 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a  his case the .**
234a0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
234b0 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
234c0 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62  ion are rolled b
234d0 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66  ack. This is dif
234e0 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61  ferent.** from a
234f0 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74   normal transact
23500 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73  ion rollback, as
23510 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65   no locks are re
23520 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  leased and the.*
23530 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  * transaction re
23540 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69  mains open..*/.i
23550 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
23560 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a  avepoint(Btree *
23570 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69  p, int op, int i
23580 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
23590 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
235a0 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
235b0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
235c0 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
235d0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
235e0 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
235f0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45  op==SAVEPOINT_RE
23600 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56  LEASE || op==SAV
23610 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
23620 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
23630 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20  Savepoint>=0 || 
23640 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20  (iSavepoint==-1 
23650 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  && op==SAVEPOINT
23660 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20  _ROLLBACK) );.  
23670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
23680 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20  ter(p);.    if( 
23690 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
236a0 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
236b0 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
236c0 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
236d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
236e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
236f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23700 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
23710 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
23720 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
23730 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
23740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23750 20 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e     if( iSavepoin
23760 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73  t<0 && (pBt->bts
23770 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54  Flags & BTS_INIT
23780 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20  IALLY_EMPTY)!=0 
23790 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
237a0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
237b0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65   }.      rc = ne
237c0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
237d0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
237e0 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b   = get4byte(28 +
237f0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
23800 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ata);..      /* 
23810 54 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  The database siz
23820 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
23830 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38  to the offset 28
23840 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20   of the header. 
23850 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65       ** when the
23860 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
23870 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77  rted, so we know
23880 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
23890 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20  at offset.      
238a0 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f  ** 28 is nonzero
238b0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
238c0 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  t( pBt->nPage>0 
238d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
238e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
238f0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23900 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
23910 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72  ate a new cursor
23920 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77   for the BTree w
23930 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20  hose root is on 
23940 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62  the page.** iTab
23950 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e  le. If a read-on
23960 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71  ly cursor is req
23970 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73  uested, it is as
23980 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
23990 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79  e caller already
239a0 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20   has at least a 
239b0 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61  read-only transa
239c0 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e  ction open.** on
239d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c   the database al
239e0 72 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74  ready. If a writ
239f0 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  e-cursor is requ
23a00 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74  ested, then.** t
23a10 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73  he caller is ass
23a20 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20  umed to have an 
23a30 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
23a40 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  action..**.** If
23a50 20 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52   the BTREE_WRCSR
23a60 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69   bit of wrFlag i
23a70 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68  s clear, then th
23a80 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
23a90 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72  y.** be used for
23aa0 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68   reading.  If th
23ab0 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69  e BTREE_WRCSR bi
23ac0 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  t is set, then t
23ad0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e  he cursor.** can
23ae0 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61   be used for rea
23af0 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74  ding or for writ
23b00 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
23b10 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
23b20 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ing.** are also 
23b30 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20  met.  These are 
23b40 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
23b50 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
23b60 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20  in order.** for 
23b70 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c  writing to be al
23b80 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
23b90 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
23ba0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
23bb0 64 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f  d with wrFlag co
23bc0 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57  ntaining BTREE_W
23bd0 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f  RCSR.**.** 2:  O
23be0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23bf0 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73  nnections that s
23c00 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61  hare the same pa
23c10 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20  ger cache.**    
23c20 20 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e   but which are n
23c30 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55  ot in the READ_U
23c40 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65  NCOMMITTED state
23c50 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a   may not have.**
23c60 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65       cursors ope
23c70 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30  n with wrFlag==0
23c80 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
23c90 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a  le.  Otherwise.*
23ca0 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65  *     the change
23cb0 73 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77  s made by this w
23cc0 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c  rite cursor woul
23cd0 64 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a  d be visible to.
23ce0 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20  **     the read 
23cf0 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f  cursors in the o
23d00 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
23d10 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
23d20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65  3:  The database
23d30 20 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c   must be writabl
23d40 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f  e (not on read-o
23d50 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a  nly media).**.**
23d60 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20   4:  There must 
23d70 62 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61  be an active tra
23d80 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
23d90 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c  The BTREE_FORDEL
23da0 45 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61  ETE bit of wrFla
23db0 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79  g may optionally
23dc0 20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45   be set if BTREE
23dd0 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74  _WRCSR.** is set
23de0 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20  .  If FORDELETE 
23df0 69 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20  is set, that is 
23e00 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d  a hint to the im
23e10 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
23e20 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72  t.** this cursor
23e30 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73   will only be us
23e40 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e  ed to seek to an
23e50 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73  d delete entries
23e60 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20   of an index.** 
23e70 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72  as part of a lar
23e80 67 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65  ger DELETE state
23e90 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45  ment.  The FORDE
23ea0 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74  LETE hint is not
23eb0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
23ec0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
23ed0 20 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74    But in a hypot
23ee0 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74  hetical alternat
23ef0 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69  ive storage engi
23f00 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ne .** in which 
23f10 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72  index entries ar
23f20 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
23f30 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72  deleted when cor
23f40 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65  responding table
23f50 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c  .** rows are del
23f60 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c  eted, the FORDEL
23f70 45 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69  ETE flag is a hi
23f80 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b  nt that all SEEK
23f90 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f   and DELETE.** o
23fa0 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69  perations on thi
23fb0 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  s cursor can be 
23fc0 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52  no-ops and all R
23fd0 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63  EAD operations c
23fe0 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  an .** return a 
23ff0 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65  null row (2-byte
24000 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a  s: 0x01 0x00)..*
24010 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
24020 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
24030 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
24040 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
24050 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
24060 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
24070 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
24080 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
24090 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
240a0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
240b0 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
240c0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
240d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
240e0 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65  orZero() has bee
240f0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70  n called.** on p
24100 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  Cur to initializ
24110 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61  e the memory spa
24120 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f  ce prior to invo
24130 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  king this routin
24140 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24150 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20   btreeCursor(.  
24160 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
24170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24180 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
24190 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
241a0 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
241d0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
241e0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
241f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74            /* 1 t
24210 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d  o write. 0 read-
24220 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74  only */.  struct
24230 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
24240 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
24250 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f   /* First arg to
24260 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
24270 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73  tion */.  BtCurs
24280 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65   /* Space for ne
242b0 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20  w cursor */.){. 
242c0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
242d0 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20   p->pBt;        
242e0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
242f0 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20  d b-tree handle 
24300 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24310 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
24320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
24330 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65  ooping over othe
24340 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f  r all cursors */
24350 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
24360 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
24370 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
24380 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20  t( wrFlag==0 .  
24390 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d       || wrFlag==
243a0 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20  BTREE_WRCSR .   
243b0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28      || wrFlag==(
243c0 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45  BTREE_WRCSR|BTRE
243d0 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20  E_FORDELETE) .  
243e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  );..  /* The fol
243f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74  lowing assert st
24400 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20  atements verify 
24410 74 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20  that if this is 
24420 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a  a sharable .  **
24430 20 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65   b-tree database
24440 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  , the connection
24450 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
24460 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c  required table l
24470 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20  ocks, .  ** and 
24480 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f  that no other co
24490 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79  nnection has any
244a0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61   open cursor tha
244b0 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68  t conflicts with
244c0 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b   .  ** this lock
244d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
244e0 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61  hasSharedCacheTa
244f0 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c  bleLock(p, iTabl
24500 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20  e, pKeyInfo!=0, 
24510 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b  (wrFlag?2:1)) );
24520 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24530 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64  g==0 || !hasRead
24540 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
24550 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  ble) );..  /* As
24560 73 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61  sert that the ca
24570 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20  ller has opened 
24580 74 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61  the required tra
24590 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61  nsaction. */.  a
245a0 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
245b0 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  s>TRANS_NONE );.
245c0 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
245d0 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e  ==0 || p->inTran
245e0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
245f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
24600 3e 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e  >pPage1 && pBt->
24610 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
24620 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61  .  assert( wrFla
24630 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74  g==0 || (pBt->bt
24640 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41  sFlags & BTS_REA
24650 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20  D_ONLY)==0 );.. 
24660 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20   if( wrFlag ){. 
24670 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53     allocateTempS
24680 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69  pace(pBt);.    i
24690 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
246a0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  e==0 ) return SQ
246b0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
246c0 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
246d0 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61 67  e==1 && btreePag
246e0 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29  ecount(pBt)==0 )
246f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 72  {.    assert( wr
24700 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Flag==0 );.    i
24710 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Table = 0;.  }..
24720 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f    /* Now that no
24730 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63 61   other errors ca
24740 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20  n occur, finish 
24750 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42  filling in the B
24760 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72  tCursor.  ** var
24770 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20  iables and link 
24780 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20  the cursor into 
24790 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73  the BtShared lis
247a0 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70  t.  */.  pCur->p
247b0 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29  gnoRoot = (Pgno)
247c0 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e  iTable;.  pCur->
247d0 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43  iPage = -1;.  pC
247e0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
247f0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
24800 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
24810 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
24820 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
24830 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46   = wrFlag ? BTCF
24840 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a  _WriteFlag : 0;.
24850 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72    pCur->curPager
24860 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24870 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52   0 : PAGER_GET_R
24880 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66  EADONLY;.  /* If
24890 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f   there are two o
248a0 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f  r more cursors o
248b0 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65  n the same btree
248c0 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a  , then all such.
248d0 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75    ** cursors *mu
248e0 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54 43  st* have the BTC
248f0 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
24900 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58  set. */.  for(pX
24910 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
24920 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
24930 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67  {.    if( pX->pg
24940 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54  noRoot==(Pgno)iT
24950 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58  able ){.      pX
24960 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
24970 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20  CF_Multiple;.   
24980 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
24990 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
249a0 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  le;.    }.  }.  
249b0 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
249c0 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42  t->pCursor;.  pB
249d0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
249e0 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
249f0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
24a00 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ID;.  return SQL
24a10 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71  ITE_OK;.}.int sq
24a20 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24a30 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
24a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a60 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
24a70 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
24a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24aa0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
24ab0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
24ac0 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
24ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24af0 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65  1 to write. 0 re
24b00 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  ad-only */.  str
24b10 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  uct KeyInfo *pKe
24b20 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  yInfo,          
24b30 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
24b40 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72  t arg to xCompar
24b50 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  e() */.  BtCurso
24b60 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65       /* Write ne
24b90 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f  w cursor here */
24ba0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
24bb0 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a  if( iTable<1 ){.
24bc0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24bd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
24be0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
24bf0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
24c00 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 43  .    rc = btreeC
24c10 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
24c20 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
24c30 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71  o, pCur);.    sq
24c40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
24c50 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
24c60 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
24c70 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
24c80 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65   a BtCursor obje
24c90 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a  ct in bytes..**.
24ca0 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  ** This interfac
24cb0 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20  es is needed so 
24cc0 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63 75  that users of cu
24cd0 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c  rsors can preall
24ce0 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69  ocate.** suffici
24cf0 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68  ent storage to h
24d00 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54  old a cursor.  T
24d10 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65  he BtCursor obje
24d20 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20  ct is opaque.** 
24d30 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65 79  to users so they
24d40 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73   cannot do the s
24d50 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76  izeof() themselv
24d60 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63  es - they must c
24d70 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  all.** this rout
24d80 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ine..*/.int sqli
24d90 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53 69  te3BtreeCursorSi
24da0 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75  ze(void){.  retu
24db0 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  rn ROUND8(sizeof
24dc0 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a  (BtCursor));.}..
24dd0 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
24de0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c   memory that wil
24df0 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69  l be converted i
24e00 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f  nto a BtCursor o
24e10 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
24e20 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68   simple approach
24e30 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74   here would be t
24e40 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65  o memset() the e
24e50 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  ntire object.** 
24e60 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74  to zero.  But it
24e70 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20   turns out that 
24e80 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64  the apPage[] and
24e90 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a   aiIdx[] arrays.
24ea0 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  ** do not need t
24eb0 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20  o be zeroed and 
24ec0 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20  they are large, 
24ed0 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20 61  so we can save a
24ee0 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74   lot.** of run-t
24ef0 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20  ime by skipping 
24f00 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  the initializati
24f10 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d  on of those elem
24f20 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ents..*/.void sq
24f30 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
24f40 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Zero(BtCursor *p
24f50 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  ){.  memset(p, 0
24f60 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  , offsetof(BtCur
24f70 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f 46 49  sor, BTCURSOR_FI
24f80 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a 7d 0a  RST_UNINIT));.}.
24f90 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
24fa0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
24fb0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
24fc0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
24fd0 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
24fe0 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
24ff0 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
25000 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
25010 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
25020 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
25030 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
25040 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
25050 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74  pBtree ){.    Bt
25060 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
25070 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
25080 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25090 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
250a0 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
250b0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
250c0 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
250d0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
250e0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
250f0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
25100 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
25110 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
25120 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
25130 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
25140 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
25150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
25160 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
25170 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
25180 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25190 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
251a0 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
251b0 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
251c0 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
251d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
251e0 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f  eReleaseAllCurso
251f0 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20  rPages(pCur);.  
25200 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
25210 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
25220 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
25230 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20  r->aOverflow);. 
25240 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25250 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
25260 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
25270 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  ve(pBtree);.    
25280 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 30  pCur->pBtree = 0
25290 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
252a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
252b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
252c0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
252d0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
252e0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
252f0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
25300 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
25310 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
25320 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
25330 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
25340 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
25350 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
25360 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
25370 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
25380 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
25390 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
253a0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
253b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
253c0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
253d0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66  seCell()..*/.#if
253e0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
253f0 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 49 6e 66  atic int cellInf
25400 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66 6f 20  oEqual(CellInfo 
25410 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a 62 29  *a, CellInfo *b)
25420 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4b 65  {.    if( a->nKe
25430 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72 65 74  y!=b->nKey ) ret
25440 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61  urn 0;.    if( a
25450 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 70  ->pPayload!=b->p
25460 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e  Payload ) return
25470 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e   0;.    if( a->n
25480 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50 61 79  Payload!=b->nPay
25490 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b  load ) return 0;
254a0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c 6f 63  .    if( a->nLoc
254b0 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20 29 20  al!=b->nLocal ) 
254c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
254d0 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d 3e 6e  ( a->nSize!=b->n
254e0 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 30 3b  Size ) return 0;
254f0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
25500 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64   }.  static void
25510 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
25520 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25530 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
25540 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
25550 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
25560 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65  info));.    btre
25570 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
25580 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78  >pPage, pCur->ix
25590 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73  , &info);.    as
255a0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
255b0 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61   || cellInfoEqua
255c0 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e  l(&info, &pCur->
255d0 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6c  info) );.  }.#el
255e0 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
255f0 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
25600 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c  endif.static SQL
25610 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
25620 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
25630 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25640 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
25650 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
25660 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
25670 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
25680 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
25690 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
256a0 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75 72 2d  ,pCur->ix,&pCur-
256b0 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  >info);.  }else{
256c0 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
256d0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d  nfo(pCur);.  }.}
256e0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
256f0 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f    /* The next ro
25700 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20  utine used only 
25710 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
25720 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a  statements */./*
25730 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
25740 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74 43  if the given BtC
25750 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20  ursor is valid. 
25760 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20   A valid cursor 
25770 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69  is one.** that i
25780 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
25790 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e  ting to a row in
257a0 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74   a (non-empty) t
257b0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73  able..** This is
257c0 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20   a verification 
257d0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
257e0 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
257f0 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e  rt() statements.
25800 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
25810 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
25820 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  d(BtCursor *pCur
25830 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  ){.  return pCur
25840 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
25850 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  ==CURSOR_VALID;.
25860 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42  }.#endif /* NDEB
25870 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  UG */.int sqlite
25880 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
25890 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a  lidNN(BtCursor *
258a0 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
258b0 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65   pCur!=0 );.  re
258c0 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74  turn pCur->eStat
258d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
258e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
258f0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
25900 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72  e integer key or
25910 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74   "rowid" for a t
25920 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54  able btree..** T
25930 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
25940 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20  nly valid for a 
25950 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
25960 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a  ointing into a.*
25970 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65  * ordinary table
25980 20 62 74 72 65 65 2e 20 20 49 66 20 74 68 65 20   btree.  If the 
25990 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f  cursor points to
259a0 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20   an index btree 
259b0 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64  or.** is invalid
259c0 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  , the result of 
259d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
259e0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36  undefined..*/.i6
259f0 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  4 sqlite3BtreeIn
25a00 74 65 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f  tegerKey(BtCurso
25a10 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25a20 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25a30 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25a40 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25a50 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25a60 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
25a70 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
25a80 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
25a90 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
25aa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
25ab0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
25ac0 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45 54  TE_ENABLE_OFFSET
25ad0 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a 2a 20  _SQL_FUNC./*.** 
25ae0 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
25af0 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  t into the datab
25b00 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
25b10 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a   start of the.**
25b20 20 70 61 79 6c 6f 61 64 20 74 6f 20 77 68 69 63   payload to whic
25b30 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  h the cursor is 
25b40 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69 36 34  pointing..*/.i64
25b50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 66 66   sqlite3BtreeOff
25b60 73 65 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  set(BtCursor *pC
25b70 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25b80 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25b90 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25ba0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25bb0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25bc0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25bd0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Cur);.  return (
25be0 69 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e 70  i64)pCur->pBt->p
25bf0 61 67 65 53 69 7a 65 2a 28 28 69 36 34 29 70 43  ageSize*((i64)pC
25c00 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e 6f 20  ur->pPage->pgno 
25c10 2d 20 31 29 20 2b 0a 20 20 20 20 20 20 20 20 20  - 1) +.         
25c20 28 69 36 34 29 28 70 43 75 72 2d 3e 69 6e 66 6f  (i64)(pCur->info
25c30 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 75 72  .pPayload - pCur
25c40 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  ->pPage->aData);
25c50 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
25c60 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53 45  ITE_ENABLE_OFFSE
25c70 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a 0a 2f  T_SQL_FUNC */../
25c80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25c90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
25ca0 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74  of payload for t
25cb0 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 43  he entry that pC
25cc0 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  ur is.** current
25cd0 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  ly pointing to. 
25ce0 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72 65 65   For table btree
25cf0 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20  s, this will be 
25d00 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
25d10 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e 64 65   data.  For inde
25d20 78 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  x btrees, this w
25d30 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a 65 20  ill be the size 
25d40 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  of the key..**.*
25d50 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
25d60 74 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  t guarantee that
25d70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
25d80 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e  ointing to a non
25d90 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65  -NULL.** valid e
25da0 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20  ntry.  In other 
25db0 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69  words, the calli
25dc0 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73  ng procedure mus
25dd0 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74  t guarantee.** t
25de0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
25df0 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65  as Cursor.eState
25e00 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  ==CURSOR_VALID..
25e10 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74  */.u32 sqlite3Bt
25e20 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 42  reePayloadSize(B
25e30 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
25e40 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
25e50 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
25e60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25e70 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25e80 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
25e90 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
25ea0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
25eb0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 7d  info.nPayload;.}
25ec0 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68  ../*.** Given th
25ed0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
25ee0 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25ef0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
25f00 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  e (parameter.** 
25f10 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63  ovfl), this func
25f20 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70  tion finds the p
25f30 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
25f40 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
25f50 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69  he .** linked li
25f60 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70  st of overflow p
25f70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c  ages. If possibl
25f80 65 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61  e, it uses the a
25f90 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f  uto-vacuum.** po
25fa0 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69  inter-map data i
25fb0 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e  nstead of readin
25fc0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
25fd0 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f   page ovfl to do
25fe0 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61   so. .**.** If a
25ff0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
26000 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
26010 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
26020 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a   Otherwise:.**.*
26030 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
26040 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76  r of the next ov
26050 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
26060 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69  he linked list i
26070 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f  s .** written to
26080 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20   *pPgnoNext. If 
26090 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65  page ovfl is the
260a0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
260b0 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73  s linked .** lis
260c0 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
260d0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
260e0 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
260f0 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20  s not NULL, and 
26100 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
26110 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
26120 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  t corresponding.
26130 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  ** to page numbe
26140 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61  r pOvfl was obta
26150 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61  ined, then *ppPa
26160 67 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ge is set to poi
26170 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65  nt to that.** re
26180 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74  ference. It is t
26190 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
261a0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
261b0 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50  to call releaseP
261c0 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50  age().** on *ppP
261d0 61 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20  age to free the 
261e0 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f  reference. In no
261f0 20 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f   reference was o
26200 62 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65  btained (because
26210 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  .** the pointer-
26220 6d 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20  map was used to 
26230 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65  obtain the value
26240 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29   for *pPgnoNext)
26250 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67  , then.** *ppPag
26260 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  e is set to zero
26270 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26280 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
26290 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
262a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
262b0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
262c0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f  file */.  Pgno o
262d0 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vfl,            
262e0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
262f0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
26300 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50  number */.  MemP
26310 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
26320 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
26330 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
26340 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f  (may be NULL) */
26350 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65  .  Pgno *pPgnoNe
26360 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  xt              
26370 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65  /* OUT: Next ove
26380 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
26390 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e  r */.){.  Pgno n
263a0 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  ext = 0;.  MemPa
263b0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20  ge *pPage = 0;. 
263c0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
263d0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
263e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
263f0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
26400 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f  ;.  assert(pPgno
26410 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20  Next);..#ifndef 
26420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
26430 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20  VACUUM.  /* Try 
26440 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74  to find the next
26450 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
26460 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67  rflow list using
26470 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61   the.  ** autova
26480 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70  cuum pointer-map
26490 20 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68   pages. Guess th
264a0 61 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  at the next page
264b0 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76   in .  ** the ov
264c0 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70  erflow list is p
264d0 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c  age number (ovfl
264e0 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65  +1). If that gue
264f0 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f  ss turns .  ** o
26500 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20  ut to be wrong, 
26510 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61  fall back to loa
26520 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66  ding the data of
26530 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62   page .  ** numb
26540 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72  er ovfl to deter
26550 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61  mine the next pa
26560 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a  ge number..  */.
26570 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
26580 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
26590 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f  o pgno;.    Pgno
265a0 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31   iGuess = ovfl+1
265b0 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  ;.    u8 eType;.
265c0 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d  .    while( PTRM
265d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
265e0 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73  Guess) || iGuess
265f0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
26600 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
26610 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20    iGuess++;.    
26620 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73  }..    if( iGues
26630 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e  s<=btreePagecoun
26640 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
26650 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
26660 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79  Bt, iGuess, &eTy
26670 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20  pe, &pgno);.    
26680 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26690 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54  _OK && eType==PT
266a0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26  RMAP_OVERFLOW2 &
266b0 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a  & pgno==ovfl ){.
266c0 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69          next = i
266d0 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72  Guess;.        r
266e0 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
266f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26700 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73   }.#endif..  ass
26710 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20  ert( next==0 || 
26720 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
26730 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
26740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
26750 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
26760 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67  pBt, ovfl, &pPag
26770 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f  e, (ppPage==0) ?
26780 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f   PAGER_GET_READO
26790 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73  NLY : 0);.    as
267a0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
267b0 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20  _OK || pPage==0 
267c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
267d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
267e0 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74    next = get4byt
267f0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b  e(pPage->aData);
26800 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70  .    }.  }..  *p
26810 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b  PgnoNext = next;
26820 0a 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b  .  if( ppPage ){
26830 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70  .    *ppPage = p
26840 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
26850 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
26860 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
26870 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
26880 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  DONE ? SQLITE_OK
26890 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   : rc);.}../*.**
268a0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
268b0 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
268c0 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
268d0 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
268e0 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
268f0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
26900 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
26910 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
26920 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
26930 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
26940 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
26950 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
26960 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
26970 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
26980 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
26990 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
269a0 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
269b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
269c0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
269d0 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
269e0 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
269f0 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
26a00 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
26a10 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
26a20 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
26a30 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
26a40 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
26a50 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
26a60 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26a70 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
26a80 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
26a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
26aa0 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
26ab0 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
26ac0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
26ad0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
26ae0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
26af0 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
26b00 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26b10 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
26b20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b40 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
26b50 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
26b60 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
26b70 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
26b80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
26b90 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
26ba0 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
26bb0 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
26bc0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
26bd0 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
26be0 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
26bf0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
26c00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
26c10 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
26c20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26c30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
26c40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
26c50 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
26c60 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
26c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
26c80 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
26c90 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
26ca0 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
26cb0 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
26cc0 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
26cd0 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
26ce0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26cf0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
26d00 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
26d10 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
26d20 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
26d30 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
26d40 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
26d50 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
26d60 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20  ointing to. The 
26d70 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  eOp.** argument 
26d80 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
26d90 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
26da0 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74     0: The operat
26db0 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50  ion is a read. P
26dc0 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72  opulate the over
26dd0 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20  flow cache..**  
26de0 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f   1: The operatio
26df0 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f  n is a write. Po
26e00 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
26e10 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
26e20 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
26e30 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
26e40 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
26e50 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
26e60 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
26e70 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
26e80 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
26e90 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
26ea0 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
26eb0 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
26ec0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
26ed0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
26ee0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
26ef0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
26f00 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
26f10 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
26f20 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
26f30 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
26f40 6c 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69  low pages.** thi
26f50 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61  s function may a
26f60 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
26f70 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
26f80 75 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65  ulate.** the ove
26f90 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
26fa0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
26fb0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
26fc0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
26fd0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
26fe0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
26ff0 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
27000 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
27010 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
27020 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
27030 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
27040 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
27050 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
27060 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  ust be.** invali
27070 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
27080 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
27090 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
270a0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
270b0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
270c0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
270d0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
270e0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
270f0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
27100 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
27110 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
27120 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27130 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
27140 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
27150 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
27160 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
27170 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
27180 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
27190 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
271a0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
271b0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
271c0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
271d0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
271e0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
271f0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
27200 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
27210 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
27220 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
27230 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
27240 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
27250 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
27260 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
27270 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
27280 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
27290 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
272a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
272b0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
272c0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
272d0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
272e0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
272f0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
27300 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
27310 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
27320 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
27330 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
27340 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
27350 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
27360 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
27370 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
27380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
27390 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
273a0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
273b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
273c0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
273d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
273e0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
273f0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
27400 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
27410 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
27420 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27430 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
27440 72 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f  rt = pBuf;     /
27450 2a 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69  * Start of origi
27460 6e 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a  nal out buffer *
27470 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  /.#endif..  asse
27480 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
27490 73 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c  ssert( eOp==0 ||
274a0 20 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73   eOp==1 );.  ass
274b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
274c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
274d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
274e0 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65  r->ix<pPage->nCe
274f0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
27500 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
27510 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74  (pCur) );..  get
27520 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
27530 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75    aPayload = pCu
27540 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27550 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
27560 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
27570 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
27580 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79  ..  assert( aPay
27590 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44  load > pPage->aD
275a0 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70  ata );.  if( (up
275b0 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70  tr)(aPayload - p
275c0 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28  Page->aData) > (
275d0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
275e0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  - pCur->info.nLo
275f0 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  cal) ){.    /* T
27600 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
27610 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
27620 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
27630 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  is an error.  Th
27640 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69  e.    ** conditi
27650 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65  onal above is re
27660 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ally:.    **    
27670 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
27680 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
27690 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
276a0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20  ->usableSize].  
276b0 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61    ** but is reca
276c0 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72  st into its curr
276d0 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69  ent form to avoi
276e0 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c  d integer overfl
276f0 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20  ow problems.    
27700 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
27710 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
27720 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20  E(pPage);.  }.. 
27730 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74   /* Check if dat
27740 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77  a must be read/w
27750 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74  ritten to/from t
27760 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74  he btree page it
27770 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f  self. */.  if( o
27780 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f  ffset<pCur->info
27790 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69  .nLocal ){.    i
277a0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
277b0 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75  if( a+offset>pCu
277c0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
277d0 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72  {.      a = pCur
277e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20  ->info.nLocal - 
277f0 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20  offset;.    }.  
27800 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f    rc = copyPaylo
27810 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66  ad(&aPayload[off
27820 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  set], pBuf, a, e
27830 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61  Op, pPage->pDbPa
27840 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ge);.    offset 
27850 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d  = 0;.    pBuf +=
27860 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61   a;.    amt -= a
27870 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
27880 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69  ffset -= pCur->i
27890 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  nfo.nLocal;.  }.
278a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
278b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29  TE_OK && amt>0 )
278c0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20  {.    const u32 
278d0 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ovflSize = pBt->
278e0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20  usableSize - 4; 
278f0 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e   /* Bytes conten
27900 74 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20  t per ovfl page 
27910 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74  */.    Pgno next
27920 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50  Page;..    nextP
27930 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
27940 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
27950 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20  nfo.nLocal]);.. 
27960 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43     /* If the BtC
27970 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b  ursor.aOverflow[
27980 5d 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  ] has not been a
27990 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
279a0 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a  te it now..    *
279b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76  *.    ** The aOv
279c0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69  erflow[] array i
279d0 73 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65  s sized at one e
279e0 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76  ntry for each ov
279f0 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
27a00 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ** in the overfl
27a10 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
27a20 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
27a30 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
27a40 70 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73  page is.    ** s
27a50 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c  tored in aOverfl
27a60 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61  ow[0], etc. A va
27a70 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20  lue of 0 in the 
27a80 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
27a90 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22  y.    ** means "
27aa0 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28  not yet known" (
27ab0 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a  the cache is laz
27ac0 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a  ily populated)..
27ad0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
27ae0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
27af0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
27b00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
27b10 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
27b20 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
27b30 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
27b40 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
27b50 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
27b60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d  pCur->aOverflow=
27b70 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76  =0.       || nOv
27b80 66 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50  fl*(int)sizeof(P
27b90 67 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61  gno) > sqlite3Ma
27ba0 6c 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61  llocSize(pCur->a
27bb0 4f 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20  Overflow).      
27bc0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  ){.        Pgno 
27bd0 2a 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73  *aNew = (Pgno*)s
27be0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20  qlite3Realloc(. 
27bf0 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
27c00 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66  >aOverflow, nOvf
27c10 6c 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  l*2*sizeof(Pgno)
27c20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
27c30 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
27c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
27c50 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
27c60 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d  _BKPT;.        }
27c70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27c80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
27c90 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
27ca0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
27cb0 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
27cc0 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
27cd0 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
27ce0 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
27cf0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c  lags |= BTCF_Val
27d00 69 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73  idOvfl;.    }els
27d10 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  e{.      /* If t
27d20 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
27d30 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
27d40 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
27d50 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
27d60 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
27d70 72 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65  rst required ove
27d80 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61  rflow page is va
27d90 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20  lid, skip.      
27da0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
27db0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
27dc0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
27dd0 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66  rflow[offset/ovf
27de0 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20  lSize] ){.      
27df0 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
27e00 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
27e10 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
27e20 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
27e30 49 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66  Idx];.        of
27e40 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
27e50 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
27e60 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
27e70 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
27e80 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20  OK && amt>0 );. 
27e90 20 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61     while( nextPa
27ea0 67 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ge ){.      /* I
27eb0 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
27ec0 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
27ed0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
27ee0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
27ef0 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt( pCur->aOverf
27f00 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20  low[iIdx]==0.   
27f10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
27f20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
27f30 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20  dx]==nextPage.  
27f40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
27f50 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
27f60 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
27f70 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
27f80 61 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  age;..      if( 
27f90 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
27fa0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
27fb0 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
27fc0 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
27fd0 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
27fe0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
27ff0 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
28000 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
28010 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
28020 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
28030 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
28040 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
28050 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
28060 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
28070 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
28080 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
28090 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
280a0 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
280b0 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
280c0 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
280d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
280e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
280f0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
28100 46 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20  F_ValidOvfl );. 
28110 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28120 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d  Cur->pBtree->db=
28130 3d 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20  =pBt->db );.    
28140 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
28150 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20  verflow[iIdx+1] 
28160 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  ){.          nex
28170 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
28180 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b  verflow[iIdx+1];
28190 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
281a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
281b0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
281c0 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
281d0 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
281e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f       }.        o
281f0 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a  ffset -= ovflSiz
28200 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
28210 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20          /* Need 
28220 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67  to read this pag
28230 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63  e properly. It c
28240 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20  ontains some of 
28250 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72  the.        ** r
28260 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61  ange of data tha
28270 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20  t is being read 
28280 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74  (eOp==0) or writ
28290 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20  ten (eOp!=0)..  
282a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
282b0 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20   int a = amt;.  
282c0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
282d0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
282e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d  ){.          a =
282f0 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73   ovflSize - offs
28300 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23  et;.        }..#
28310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
28320 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
28330 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  D.        /* If 
28340 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  all the followin
28350 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20  g are true:.    
28360 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28370 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61  *   1) this is a
28380 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c   read operation,
28390 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a   and .        **
283a0 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65     2) data is re
283b0 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20  quired from the 
283c0 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76  start of this ov
283d0 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64  erflow page, and
283e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29  .        **   3)
283f0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69   there are no di
28400 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
28410 20 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20 20   page-cache.    
28420 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20      **   4) the 
28430 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
28440 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
28450 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
28460 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
28470 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20  the WAL file.   
28480 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20       **   6) at 
28490 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
284a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
284b0 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
284c0 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
284d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
284e0 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
284f0 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
28500 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
28510 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
28520 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
28530 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
28540 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
28550 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
28560 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
28570 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
28580 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
28590 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
285a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
285b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
285c0 20 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20     if( eOp==0   
285d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
28600 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
28610 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28640 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
28650 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
28660 50 61 67 65 72 44 69 72 65 63 74 52 65 61 64 4f  PagerDirectReadO
28670 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  k(pBt->pPager, n
28680 65 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20 28  extPage)    /* (
28690 33 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20  3,4,5) */.      
286a0 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e     && &pBuf[-4]>
286b0 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20  =pBufStart      
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20           /* (6) 
286e0 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  */.        ){.  
286f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
28700 66 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69 74  file *fd = sqlit
28710 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
28720 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
28730 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
28740 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
28750 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
28760 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
28770 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
28780 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
28790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287a0 20 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20    /* due to (6) 
287b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  */.          mem
287c0 63 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74  cpy(aSave, aWrit
287d0 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 4);.         
287e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
287f0 65 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20  ead(fd, aWrite, 
28800 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70  a+4, (i64)pBt->p
28810 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67  ageSize*(nextPag
28820 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20  e-1));.         
28830 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
28840 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20  byte(aWrite);.  
28850 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
28860 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29  Write, aSave, 4)
28870 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a  ;.        }else.
28880 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
28890 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
288a0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20  ge *pDbPage;.   
288b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
288c0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
288d0 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
288e0 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20  e, &pDbPage,.   
288f0 20 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d             (eOp=
28900 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  =0 ? PAGER_GET_R
28910 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20  EADONLY : 0).   
28920 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
28930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28950 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
28960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
28970 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
28980 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
28990 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
289a0 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
289b0 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
289c0 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
289d0 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
289e0 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
289f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
28a00 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
28a10 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
28a20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
28a30 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
28a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
28a50 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
28a60 20 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20     if( amt==0 ) 
28a70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
28a80 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
28a90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
28aa0 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
28ab0 20 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a    iIdx++;.    }.
28ac0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
28ad0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
28ae0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72  0 ){.    /* Over
28af0 66 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20  flow chain ends 
28b00 70 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20  prematurely */. 
28b10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28b20 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
28b30 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
28b40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28b50 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65  Read part of the
28b60 20 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65   payload for the
28b70 20 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68   row at which th
28b80 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
28b90 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70  s currently.** p
28ba0 6f 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20  ointing.  "amt" 
28bb0 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72  bytes will be tr
28bc0 61 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70  ansferred into p
28bd0 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
28be0 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
28bf0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
28c00 2a 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f  * pCur can be po
28c10 69 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72  inting to either
28c20 20 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69   a table or an i
28c30 6e 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20  ndex b-tree..** 
28c40 49 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  If pointing to a
28c50 20 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68   table btree, th
28c60 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  en the content s
28c70 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20  ection is read. 
28c80 20 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70   If.** pCur is p
28c90 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e  ointing to an in
28ca0 64 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20  dex b-tree then 
28cb0 74 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20  the key section 
28cc0 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  is read..**.** F
28cd0 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
28ce0 61 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61  ayload(), the ca
28cf0 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
28d00 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f   that pCur is po
28d10 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76  inting.** to a v
28d20 61 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20  alid row in the 
28d30 74 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69  table.  For sqli
28d40 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
28d50 68 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a  hecked(), the.**
28d60 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65   cursor might be
28d70 20 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68   invalid or migh
28d80 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73  t need to be res
28d90 74 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  tored before bei
28da0 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52  ng read..**.** R
28db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28dc0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
28dd0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
28de0 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
28df0 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
28e00 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
28e10 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
28e20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
28e30 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
28e40 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
28e50 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
28e60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
28e70 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
28e80 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
28e90 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
28ea0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
28eb0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
28ec0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28ed0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
28ee0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
28ef0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
28f00 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
28f10 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
28f20 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
28f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
28f40 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
28f50 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
28f60 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
28f70 66 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f, 0);.}../*.** 
28f80 54 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20  This variant of 
28f90 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
28fa0 6f 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e  oad() works even
28fb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68   if the cursor h
28fc0 61 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65  as not.** in the
28fd0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74   CURSOR_VALID st
28fe0 61 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79  ate.  It is only
28ff0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
29000 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29  ite3_blob_read()
29010 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  .** interface..*
29020 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
29030 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73  _OMIT_INCRBLOB.s
29040 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
29050 4e 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73  NLINE int access
29060 50 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a  PayloadChecked(.
29070 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
29080 2c 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a  ,.  u32 offset,.
29090 20 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69    u32 amt,.  voi
290a0 64 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74  d *pBuf.){.  int
290b0 20 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72   rc;.  if ( pCur
290c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
290d0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
290e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42  return SQLITE_AB
290f0 4f 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ORT;.  }.  asser
29100 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
29110 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
29120 20 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f   rc = btreeResto
29130 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
29140 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
29150 20 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73   rc ? rc : acces
29160 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
29170 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
29180 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
29190 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43  te3BtreePayloadC
291a0 68 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20  hecked(BtCursor 
291b0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
291c0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
291d0 20 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70   *pBuf){.  if( p
291e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
291f0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
29200 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29210 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29220 29 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) );.    return 
29230 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29240 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
29250 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c   pBuf, 0);.  }el
29260 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61  se{.    return a
29270 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
29280 6b 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  ked(pCur, offset
29290 2c 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20  , amt, pBuf);.  
292a0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
292b0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
292c0 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
292d0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
292e0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
292f0 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
29300 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
29310 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
29320 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
29330 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
29340 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
29350 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
29360 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
29370 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
29380 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
29390 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
293a0 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
293b0 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
293c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
293d0 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
293e0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
293f0 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
29400 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
29410 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
29420 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
29430 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
29440 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29450 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
29460 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
29470 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
29480 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
29490 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
294a0 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
294b0 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
294c0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
294d0 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
294e0 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
294f0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
29500 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
29510 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
29520 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
29530 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
29540 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
29550 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
29560 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
29570 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
29580 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
29590 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
295a0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
295b0 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
295c0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
295d0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
295e0 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
295f0 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
29600 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
29610 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
29620 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
29630 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
29640 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
29650 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
29660 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
29670 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
29680 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
29690 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
296a0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
296b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
296c0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
296d0 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
296e0 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
296f0 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
29700 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
29710 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
29720 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
29730 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74   */.){.  int amt
29740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29750 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
29760 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ge>=0 && pCur->p
29770 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Page);.  assert(
29780 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29790 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
297a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
297b0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
297c0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
297d0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
297e0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
297f0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29800 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
29810 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
29820 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
29830 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
29840 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
29850 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
29860 6c 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65  load>pCur->pPage
29870 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55  ->aData || CORRU
29880 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
29890 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50  t( pCur->info.pP
298a0 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61  ayload<pCur->pPa
298b0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  ge->aDataEnd ||C
298c0 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
298d0 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
298e0 4c 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74  Local;.  if( amt
298f0 3e 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61  >(int)(pCur->pPa
29900 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  ge->aDataEnd - p
29910 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29920 61 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ad) ){.    /* Th
29930 65 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c  ere is too littl
29940 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
29950 61 67 65 20 66 6f 72 20 74 68 65 20 65 78 70 65  age for the expe
29960 63 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20  cted amount.    
29970 2a 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74  ** of local cont
29980 65 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75  ent. Database mu
29990 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
299a0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  /.    assert( CO
299b0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
299c0 61 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e  amt = MAX(0, (in
299d0 74 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t)(pCur->pPage->
299e0 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d  aDataEnd - pCur-
299f0 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29  >info.pPayload))
29a00 3b 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20  ;.  }.  *pAmt = 
29a10 28 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75  (u32)amt;.  retu
29a20 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e  rn (void*)pCur->
29a30 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d  info.pPayload;.}
29a40 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
29a50 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
29a60 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
29a70 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
29a80 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
29a90 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
29aa0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
29ab0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
29ac0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
29ad0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
29ae0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
29af0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
29b00 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
29b10 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
29b20 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
29b30 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
29b40 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
29b50 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
29b60 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
29b70 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
29b80 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
29b90 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
29ba0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
29bb0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
29bc0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
29bd0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
29be0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
29bf0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
29c00 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
29c10 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
29c20 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
29c30 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
29c40 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
29c50 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
29c60 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
29c70 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
29c80 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
29c90 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61   *sqlite3BtreePa
29ca0 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72  yloadFetch(BtCur
29cb0 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
29cc0 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  pAmt){.  return 
29cd0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
29ce0 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a  r, pAmt);.}.../*
29cf0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
29d00 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65  sor down to a ne
29d10 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54  w child page.  T
29d20 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d  he newPgno argum
29d30 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61  ent is the.** pa
29d40 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
29d50 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d   child page to m
29d60 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  ove to..**.** Th
29d70 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
29d80 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  rns SQLITE_CORRU
29d90 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68  PT if the page-h
29da0 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c  eader flags fiel
29db0 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20  d of.** the new 
29dc0 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20  child page does 
29dd0 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c  not match the fl
29de0 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ags field of the
29df0 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a   parent (i.e..**
29e00 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61   if an intkey pa
29e10 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  ge appears to be
29e20 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61   the parent of a
29e30 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65   non-intkey page
29e40 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72  , or.** vice-ver
29e50 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sa)..*/.static i
29e60 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42  nt moveToChild(B
29e70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
29e80 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42  32 newPgno){.  B
29e90 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
29ea0 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  Cur->pBt;..  ass
29eb0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
29ec0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
29ed0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
29ee0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29ef0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
29f00 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42  t( pCur->iPage<B
29f10 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
29f20 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  H );.  assert( p
29f30 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b  Cur->iPage>=0 );
29f40 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
29f50 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
29f60 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
29f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29f80 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
29f90 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  }.  pCur->info.n
29fa0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
29fb0 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28  ->curFlags &= ~(
29fc0 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29fd0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29fe0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29ff0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75  ur->iPage] = pCu
2a000 72 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61  r->ix;.  pCur->a
2a010 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a020 65 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  e] = pCur->pPage
2a030 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30  ;.  pCur->ix = 0
2a040 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b  ;.  pCur->iPage+
2a050 2b 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41  +;.  return getA
2a060 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
2a070 6e 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e  newPgno, &pCur->
2a080 70 50 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75  pPage, pCur, pCu
2a090 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2a0a0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
2a0b0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
2a0c0 50 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20  Page pParent is 
2a0d0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e  an internal (non
2a0e0 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65  -leaf) tree page
2a0f0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
2a100 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74  .** asserts that
2a110 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68   page number iCh
2a120 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d  ild is the left-
2a130 63 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64  child if the iId
2a140 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20  x'th.** cell in 
2a150 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72  page pParent. Or
2a160 2c 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75  , if iIdx is equ
2a170 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20  al to the total 
2a180 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c  number of.** cel
2a190 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74  ls in pParent, t
2a1a0 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  hat page number 
2a1b0 69 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69  iChild is the ri
2a1c0 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20  ght-child of.** 
2a1d0 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  the page..*/.sta
2a1e0 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50  tic void assertP
2a1f0 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61  arentIndex(MemPa
2a200 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74  ge *pParent, int
2a210 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69   iIdx, Pgno iChi
2a220 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55  ld){.  if( CORRU
2a230 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20  PT_DB ) return; 
2a240 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f   /* The conditio
2a250 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20  ns tested below 
2a260 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75  might not be tru
2a270 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
2a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
2a290 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61   in a corrupt da
2a2a0 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65  tabase */.  asse
2a2b0 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e  rt( iIdx<=pParen
2a2c0 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66  t->nCell );.  if
2a2d0 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d  ( iIdx==pParent-
2a2e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73  >nCell ){.    as
2a2f0 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26  sert( get4byte(&
2a300 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
2a310 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
2a320 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b  t+8])==iChild );
2a330 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2a340 73 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66  sert( get4byte(f
2a350 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  indCell(pParent,
2a360 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20   iIdx))==iChild 
2a370 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23  );.  }.}.#else.#
2a380 20 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50    define assertP
2a390 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a  arentIndex(x,y,z
2a3a0 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  ) .#endif../*.**
2a3b0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2a3c0 20 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e   up to the paren
2a3d0 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  t page..**.** pC
2a3e0 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
2a3f0 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78  o the cell index
2a400 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2a410 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f  he pointer.** to
2a420 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
2a430 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49   coming from.  I
2a440 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  f we are coming 
2a450 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68  from the.** righ
2a460 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67  t-most child pag
2a470 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78  e then pCur->idx
2a480 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d   is set to one m
2a490 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ore than.** the 
2a4a0 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64  largest cell ind
2a4b0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
2a4c0 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28  id moveToParent(
2a4d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2a4e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61  .  MemPage *pLea
2a4f0 66 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f;.  assert( cur
2a500 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2a510 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2a520 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2a530 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2a540 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a550 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
2a560 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2a570 65 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72  e );.  assertPar
2a580 65 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43  entIndex(.    pC
2a590 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a5a0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2a5b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2a5c0 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20  ->iPage-1], .   
2a5d0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67   pCur->pPage->pg
2a5e0 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61  no.  );.  testca
2a5f0 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  se( pCur->aiIdx[
2a600 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e  pCur->iPage-1] >
2a610 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2a620 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43  ur->iPage-1]->nC
2a630 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69  ell );.  pCur->i
2a640 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2a650 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a660 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2a670 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a680 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20  fl);.  pCur->ix 
2a690 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
2a6a0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
2a6b0 70 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50  pLeaf = pCur->pP
2a6c0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  age;.  pCur->pPa
2a6d0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2a6e0 65 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d  e[--pCur->iPage]
2a6f0 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e  ;.  releasePageN
2a700 6f 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d  otNull(pLeaf);.}
2a710 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2a720 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74   cursor to point
2a730 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67   to the root pag
2a740 65 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20  e of its b-tree 
2a750 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
2a760 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61   If the table ha
2a770 73 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  s a virtual root
2a780 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20   page, then the 
2a790 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
2a7a0 74 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74  to point.** to t
2a7b0 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
2a7c0 70 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20  page instead of 
2a7d0 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
2a7e0 70 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61  page. A table ha
2a7f0 73 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  s a.** virtual r
2a800 6f 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68  oot page when th
2a810 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
2a820 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
2a830 65 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73  ells and a .** s
2a840 69 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65  ingle child page
2a850 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20  . This can only 
2a860 68 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20  happen with the 
2a870 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
2a880 70 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  page 1..**.** If
2a890 20 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75   the b-tree stru
2a8a0 63 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20  cture is empty, 
2a8b0 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65  the cursor state
2a8c0 20 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43   is set to .** C
2a8d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e  URSOR_INVALID an
2a8e0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  d this routine r
2a8f0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d  eturns SQLITE_EM
2a900 50 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  PTY. Otherwise,.
2a910 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
2a920 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
2a930 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
2a940 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72  located on the r
2a950 6f 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75  oot.** (or virtu
2a960 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e  al root) page an
2a970 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61  d the cursor sta
2a980 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
2a990 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a  SOR_VALID..**.**
2a9a0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
2a9b0 6e 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  n returns succes
2a9c0 73 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62  sfully, it may b
2a9d0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2a9e0 68 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65  he.** page-heade
2a9f0 72 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65  r flags indicate
2aa00 20 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75   that the [virtu
2aa10 61 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73  al] root-page is
2aa20 20 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a   the expected .*
2aa30 2a 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65  * kind of b-tree
2aa40 20 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77   page (i.e. if w
2aa50 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2aa60 63 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65  cursor the calle
2aa70 72 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65  r did not.** spe
2aa80 63 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73  cify a KeyInfo s
2aa90 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2aaa0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2aab0 6f 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a  o 0x05 or 0x0D,.
2aac0 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20  ** indicating a 
2aad0 74 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72  table b-tree, or
2aae0 20 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64   if the caller d
2aaf0 69 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  id specify a Key
2ab00 49 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75  Info .** structu
2ab10 72 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  re the flags byt
2ab20 65 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32  e is set to 0x02
2ab30 20 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61   or 0x0A, indica
2ab40 74 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a  ting an index.**
2ab50 20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61   b-tree)..*/.sta
2ab60 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f  tic int moveToRo
2ab70 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
2ab80 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
2ab90 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Root;.  int rc =
2aba0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2abb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2abc0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2abd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2abe0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
2abf0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2ac00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2ac10 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
2ac20 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2ac30 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
2ac40 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
2ac50 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2ac60 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
2ac70 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43  pCur->eState < C
2ac80 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2ac90 4b 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  K || pCur->iPage
2aca0 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  <0 );.  assert( 
2acb0 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30  pCur->pgnoRoot>0
2acc0 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c   || pCur->iPage<
2acd0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  0 );..  if( pCur
2ace0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
2acf0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2ad00 65 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  e ){.      relea
2ad10 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
2ad20 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
2ad30 20 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d    while( --pCur-
2ad40 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2ad50 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
2ad60 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Null(pCur->apPag
2ad70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b  e[pCur->iPage]);
2ad80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
2ad90 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75  Cur->pPage = pCu
2ada0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20  r->apPage[0];.  
2adb0 20 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e      goto skip_in
2adc0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  it;.    }.  }els
2add0 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f  e if( pCur->pgno
2ade0 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Root==0 ){.    p
2adf0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2ae00 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2ae10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae20 45 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  EMPTY;.  }else{.
2ae30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ae40 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b  ->iPage==(-1) );
2ae50 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65  .    if( pCur->e
2ae60 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45  State>=CURSOR_RE
2ae70 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20  QUIRESEEK ){.   
2ae80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
2ae90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
2aea0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  T ){.        ass
2aeb0 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2aec0 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ext!=SQLITE_OK )
2aed0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2aee0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b   pCur->skipNext;
2aef0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2af00 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2af10 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
2af20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
2af30 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
2af40 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
2af50 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
2af60 70 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20  pCur->pPage,.   
2af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af80 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75       0, pCur->cu
2af90 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20  rPagerFlags);.  
2afa0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2afb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75  _OK ){.      pCu
2afc0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2afd0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2afe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2aff0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61   }.    pCur->iPa
2b000 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ge = 0;.    pCur
2b010 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43  ->curIntKey = pC
2b020 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ur->pPage->intKe
2b030 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
2b040 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2b050 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
2b060 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
2b070 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  oot );..  /* If 
2b080 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69  pCur->pKeyInfo i
2b090 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
2b0a0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74   the caller that
2b0b0 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72   opened this cur
2b0c0 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65  sor.  ** expecte
2b0d0 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20  d to open it on 
2b0e0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
2b0f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
2b100 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20  KeyInfo is.  ** 
2b110 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72  NULL, the caller
2b120 20 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65   expects a table
2b130 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73   b-tree. If this
2b140 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65   is not the case
2b150 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e  ,.  ** return an
2b160 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
2b170 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a  error. .  **.  *
2b180 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  * Earlier versio
2b190 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73  ns of SQLite ass
2b1a0 75 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74  umed that this t
2b1b0 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61  est could not fa
2b1c0 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72  il.  ** if the r
2b1d0 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72  oot page was alr
2b1e0 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e  eady loaded when
2b1f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2b200 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a  as called (i.e..
2b210 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50    ** if pCur->iP
2b220 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69  age>=0). But thi
2b230 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74  s is not so if t
2b240 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2b250 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69  orrupted .  ** i
2b260 6e 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61  n such a way tha
2b270 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20  t page pRoot is 
2b280 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65  linked into a se
2b290 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c  cond b-tree tabl
2b2a0 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20  e .  ** (or the 
2b2b0 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20  freelist).  */. 
2b2c0 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
2b2d0 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f  intKey==1 || pRo
2b2e0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  ot->intKey==0 );
2b2f0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73  .  if( pRoot->is
2b300 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72  Init==0 || (pCur
2b310 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d  ->pKeyInfo==0)!=
2b320 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b  pRoot->intKey ){
2b330 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2b340 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
2b350 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
2b360 7d 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a  }..skip_init:  .
2b370 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a    pCur->ix = 0;.
2b380 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2b390 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2b3a0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2b3b0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
2b3c0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2b3d0 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f  lidOvfl);..  pRo
2b3e0 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ot = pCur->pPage
2b3f0 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e  ;.  if( pRoot->n
2b400 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43  Cell>0 ){.    pC
2b410 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2b420 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c  SOR_VALID;.  }el
2b430 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c  se if( !pRoot->l
2b440 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
2b450 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28  subpage;.    if(
2b460 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20   pRoot->pgno!=1 
2b470 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2b480 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2b490 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
2b4a0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
2b4b0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
2b4c0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2b4d0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2b4e0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  OR_VALID;.    rc
2b4f0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2b500 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20  Cur, subpage);. 
2b510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72   }else{.    pCur
2b520 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2b530 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72  R_INVALID;.    r
2b540 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59  c = SQLITE_EMPTY
2b550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2b560 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
2b570 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
2b580 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   to the left-mos
2b590 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e  t leaf entry ben
2b5a0 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72  eath the.** entr
2b5b0 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  y to which it is
2b5c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
2b5d0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ing..**.** The l
2b5e0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73  eft-most leaf is
2b5f0 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
2b600 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d  e smallest key -
2b610 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2b620 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2b630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b640 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42  moveToLeftmost(B
2b650 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2b660 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
2b670 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2b680 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2b690 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2b6a0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2b6b0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2b6c0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b6d0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2b6e0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
2b6f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
2b700 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2b710 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
2b720 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b730 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ix<pPage->nCell 
2b740 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
2b750 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
2b760 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29  pPage, pCur->ix)
2b770 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
2b780 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
2b790 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
2b7a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
2b7b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
2b7c0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
2b7d0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
2b7e0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
2b7f0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
2b800 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
2b810 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
2b820 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
2b830 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
2b840 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
2b850 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
2b860 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
2b870 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2b880 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
2b890 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
2b8a0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
2b8b0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
2b8c0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
2b8d0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
2b8e0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
2b8f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
2b900 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
2b910 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
2b920 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
2b930 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
2b940 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
2b950 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2b960 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
2b970 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2b980 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
2b990 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b9a0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
2b9b0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
2b9c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b9d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b9e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b9f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ba00 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2ba10 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
2ba20 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29  ->pPage)->leaf )
2ba30 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
2ba40 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2ba50 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2ba60 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
2ba70 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2ba80 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
2ba90 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2baa0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
2bab0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2bac0 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20  .  }.  pCur->ix 
2bad0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
2bae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2baf0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2bb00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
2bb10 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2bb20 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
2bb30 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
2bb40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
2bb50 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2bb60 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2bb70 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2bb80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2bb90 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2bba0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2bbb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2bbc0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2bbd0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2bbe0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2bbf0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2bc00 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2bc10 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
2bc20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2bc30 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2bc40 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2bc50 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2bc60 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2bc70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2bc80 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2bc90 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2bca0 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f  ex) );.  rc = mo
2bcb0 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a  veToRoot(pCur);.
2bcc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bcd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
2bce0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
2bcf0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a  nCell>0 );.    *
2bd00 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63  pRes = 0;.    rc
2bd10 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
2bd20 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2bd30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bd40 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73  EMPTY ){.    ass
2bd50 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2bd60 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2bd70 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2bd80 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  );.    *pRes = 1
2bd90 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2bda0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
2bdb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2bdc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2bdd0 20 61 20 6e 6f 2d 6f 70 20 69 66 20 63 75 72 73   a no-op if curs
2bde0 6f 72 20 70 43 75 72 20 64 6f 65 73 20 6e 6f 74  or pCur does not
2bdf0 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
2be00 64 20 72 6f 77 2e 0a 2a 2a 20 4f 74 68 65 72 77  d row..** Otherw
2be10 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
2be20 76 61 6c 69 64 2c 20 63 6f 6e 66 69 67 75 72 65  valid, configure
2be30 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 20   it so that the 
2be40 6e 65 78 74 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  next call to.** 
2be50 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74  sqlite3BtreeNext
2be60 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  () is a no-op..*
2be70 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2be80 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
2be90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
2bea0 65 65 53 6b 69 70 4e 65 78 74 28 42 74 43 75 72  eeSkipNext(BtCur
2beb0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a  sor *pCur){.  /*
2bec0 20 57 65 20 62 65 6c 69 65 76 65 20 74 68 61 74   We believe that
2bed0 20 74 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   the cursor must
2bee0 20 61 6c 77 61 79 73 20 62 65 20 69 6e 20 74 68   always be in th
2bef0 65 20 76 61 6c 69 64 20 73 74 61 74 65 20 77 68  e valid state wh
2bf00 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75  en.  ** this rou
2bf10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
2bf20 62 75 74 20 74 68 65 20 70 72 6f 6f 66 20 69 73  but the proof is
2bf30 20 64 69 66 66 69 63 75 6c 74 2c 20 73 6f 20 77   difficult, so w
2bf40 65 20 61 64 64 20 61 6e 0a 20 20 2a 2a 20 41 4c  e add an.  ** AL
2bf50 57 61 59 53 28 29 20 74 65 73 74 20 6a 75 73 74  WaYS() test just
2bf60 20 69 6e 20 63 61 73 65 20 77 65 20 61 72 65 20   in case we are 
2bf70 77 72 6f 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20  wrong. */.  if( 
2bf80 41 4c 57 41 59 53 28 70 43 75 72 2d 3e 65 53 74  ALWAYS(pCur->eSt
2bf90 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2bfa0 44 29 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  D) ){.    pCur->
2bfb0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2bfc0 53 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 70 43  SKIPNEXT;.    pC
2bfd0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 31  ur->skipNext = 1
2bfe0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
2bff0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  * SQLITE_OMIT_WI
2c000 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 20  NDOWFUNC */../* 
2c010 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2c020 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2c030 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
2c040 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2c050 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
2c060 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
2c070 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
2c080 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
2c090 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
2c0a0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
2c0b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2c0c0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2c0d0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
2c0e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2c0f0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2c100 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
2c110 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2c120 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2c130 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2c140 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2c150 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2c160 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
2c170 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
2c180 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
2c190 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
2c1a0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
2c1b0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
2c1c0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2c1d0 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
2c1e0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2c1f0 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
2c200 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2c210 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
2c220 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
2c230 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
2c240 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
2c250 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
2c260 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2c270 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
2c280 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
2c290 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
2c2a0 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
2c2b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2c2c0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
2c2d0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
2c2e0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2c2f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2c300 75 72 2d 3e 69 78 3d 3d 70 43 75 72 2d 3e 70 50  ur->ix==pCur->pP
2c310 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a  age->nCell-1 );.
2c320 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2c330 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  ->pPage->leaf );
2c340 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
2c350 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c360 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
2c370 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
2c380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c390 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2c3a0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2c3b0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
2c3c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
2c3d0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2c3e0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2c3f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2c400 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  K ){.      pCur-
2c410 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2c420 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d 65  F_AtLast;.    }e
2c430 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
2c440 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
2c450 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 7d  CF_AtLast;.    }
2c460 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d  .  }else if( rc=
2c470 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b  =SQLITE_EMPTY ){
2c480 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2c490 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2c4a0 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  | pCur->pPage->n
2c4b0 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a  Cell==0 );.    *
2c4c0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63  pRes = 1;.    rc
2c4d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2c4e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2c4f0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2c500 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
2c510 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
2c520 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
2c530 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
2c540 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b   pIdxKey or intK
2c550 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73  ey.   Return a s
2c560 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a  uccess code..**.
2c570 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61  ** For INTKEY ta
2c580 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79  bles, the intKey
2c590 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
2c5a0 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a  ed.  pIdxKey .**
2c5b0 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20   must be NULL.  
2c5c0 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2c5d0 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65  , pIdxKey is use
2c5e0 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20  d and intKey.** 
2c5f0 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a  is ignored..**.*
2c600 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61  * If an exact ma
2c610 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  tch is not found
2c620 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
2c630 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c  r is always.** l
2c640 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2c650 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63  a leaf page whic
2c660 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65  h would hold the
2c670 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20   entry if it.** 
2c680 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54  were present.  T
2c690 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20  he cursor might 
2c6a0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72  point to an entr
2c6b0 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20  y that comes.** 
2c6c0 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20  before or after 
2c6d0 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41  the key..**.** A
2c6e0 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69  n integer is wri
2c6f0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20  tten into *pRes 
2c700 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73  which is the res
2c710 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72  ult of.** compar
2c720 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
2c730 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
2c740 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
2c750 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  s .** pointing. 
2c760 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20   The meaning of 
2c770 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74  the integer writ
2c780 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65  ten into.** *pRe
2c790 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  s is as follows:
2c7a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
2c7b0 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  <0      The curs
2c7c0 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
2c7d0 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2c7e0 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
2c7f0 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c           is smal
2c800 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f  ler than intKey/
2c810 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68  pIdxKey or if th
2c820 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
2c830 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c840 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72       and the cur
2c850 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65  sor is therefore
2c860 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e   left point to n
2c870 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  othing..**.**   
2c880 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54    *pRes==0     T
2c890 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2c8a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c8b0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c8d0 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2c8e0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a  intKey/pIdxKey..
2c8f0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e  **.**     *pRes>
2c900 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
2c910 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2c920 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2c930 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2c940 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65          is large
2c950 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49  r than intKey/pI
2c960 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  dxKey..**.** For
2c970 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 74   index tables, t
2c980 68 65 20 70 49 64 78 4b 65 79 2d 3e 65 71 53 65  he pIdxKey->eqSe
2c990 65 6e 20 66 69 65 6c 64 20 69 73 20 73 65 74 20  en field is set 
2c9a0 74 6f 20 31 20 69 66 20 74 68 65 72 65 0a 2a 2a  to 1 if there.**
2c9b0 20 65 78 69 73 74 73 20 61 6e 20 65 6e 74 72 79   exists an entry
2c9c0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2c9d0 61 74 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68  at exactly match
2c9e0 65 73 20 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f  es pIdxKey.  .*/
2c9f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2ca00 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
2ca10 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2ca20 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  r,          /* T
2ca30 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20  he cursor to be 
2ca40 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63  moved */.  Unpac
2ca50 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b  kedRecord *pIdxK
2ca60 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20  ey, /* Unpacked 
2ca70 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69  index key */.  i
2ca80 36 34 20 69 6e 74 4b 65 79 2c 20 20 20 20 20 20  64 intKey,      
2ca90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2caa0 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  able key */.  in
2cab0 74 20 62 69 61 73 52 69 67 68 74 2c 20 20 20 20  t biasRight,    
2cac0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
2cad0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
2cae0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
2caf0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
2cb00 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2cb10 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68   /* Write search
2cb20 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f   results here */
2cb30 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
2cb40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 78 52  RecordCompare xR
2cb50 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20  ecordCompare;.. 
2cb60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2cb70 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2cb80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2cb90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2cba0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2cbb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2cbc0 61 73 73 65 72 74 28 20 70 52 65 73 20 29 3b 0a  assert( pRes );.
2cbd0 20 20 61 73 73 65 72 74 28 20 28 70 49 64 78 4b    assert( (pIdxK
2cbe0 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70  ey==0)==(pCur->p
2cbf0 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20  KeyInfo==0) );. 
2cc00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2cc10 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2cc20 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b 65 79 3d  LID || (pIdxKey=
2cc30 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63 75 72 49  =0)==(pCur->curI
2cc40 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a 0a 20 20  ntKey!=0) );..  
2cc50 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2cc60 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
2cc70 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
2cc80 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
2cc90 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
2cca0 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
2ccb0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
2ccc0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
2ccd0 69 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 0a 20  if( pIdxKey==0. 
2cce0 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
2ccf0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2cd00 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
2cd10 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2cd20 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  Key)!=0.  ){.   
2cd30 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
2cd40 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a  nKey==intKey ){.
2cd50 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2cd60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2cd70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2cd80 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
2cd90 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29 7b  o.nKey<intKey ){
2cda0 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
2cdb0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2cdc0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2cdd0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2cde0 2d 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  -1;.        retu
2cdf0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ce00 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 49      }.      /* I
2ce10 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
2ce20 6b 65 79 20 69 73 20 6f 6e 65 20 6d 6f 72 65 20  key is one more 
2ce30 74 68 61 6e 20 74 68 65 20 70 72 65 76 69 6f 75  than the previou
2ce40 73 20 6b 65 79 2c 20 74 68 65 6e 0a 20 20 20 20  s key, then.    
2ce50 20 20 2a 2a 20 74 72 79 20 74 6f 20 67 65 74 20    ** try to get 
2ce60 74 68 65 72 65 20 75 73 69 6e 67 20 73 71 6c 69  there using sqli
2ce70 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20 72  te3BtreeNext() r
2ce80 61 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c  ather than a ful
2ce90 6c 0a 20 20 20 20 20 20 2a 2a 20 62 69 6e 61 72  l.      ** binar
2cea0 79 20 73 65 61 72 63 68 2e 20 20 54 68 69 73 20  y search.  This 
2ceb0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
2cec0 6f 6e 20 6f 6e 6c 79 2e 20 20 54 68 65 20 63 6f  on only.  The co
2ced0 72 72 65 63 74 20 61 6e 73 77 65 72 0a 20 20 20  rrect answer.   
2cee0 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20 6f     ** is still o
2cef0 62 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20  btained without 
2cf00 74 68 69 73 20 63 61 73 65 2c 20 6f 6e 6c 79 20  this case, only 
2cf10 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65 20 73 6c  a little more sl
2cf20 6f 77 65 6c 79 20 2a 2f 0a 20 20 20 20 20 20 69  owely */.      i
2cf30 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2cf40 65 79 2b 31 3d 3d 69 6e 74 4b 65 79 20 26 26 20  ey+1==intKey && 
2cf50 21 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20  !pCur->skipNext 
2cf60 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  ){.        *pRes
2cf70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2cf80 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
2cf90 65 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20  ext(pCur, 0);.  
2cfa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2cfb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cfc0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
2cfd0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20  (pCur);.        
2cfe0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
2cff0 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  .nKey==intKey ){
2d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2d010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d020 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d030 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2d040 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
2d050 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2d060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d070 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d080 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d0a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2d0b0 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20   pIdxKey ){.    
2d0c0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d  xRecordCompare =
2d0d0 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
2d0e0 43 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29  Compare(pIdxKey)
2d0f0 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65  ;.    pIdxKey->e
2d100 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  rrCode = 0;.    
2d110 61 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d  assert( pIdxKey-
2d120 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a  >default_rc==1 .
2d130 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2d140 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2d150 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
2d160 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74  pIdxKey->default
2d170 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20  _rc==-1.    );. 
2d180 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63   }else{.    xRec
2d190 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20  ordCompare = 0; 
2d1a0 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20  /* All keys are 
2d1b0 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a  integers */.  }.
2d1c0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
2d1d0 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
2d1e0 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  rc ){.    if( rc
2d1f0 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29  ==SQLITE_EMPTY )
2d200 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2d210 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2d220 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65  0 || pCur->pPage
2d230 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20  ->nCell==0 );.  
2d240 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2d250 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d260 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2d270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2d280 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d290 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2d2a0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2d2b0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
2d2c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d2d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2d2e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2d2f0 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2d300 3e 20 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  > 0 );.  assert(
2d310 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2d320 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2d330 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72  0]->intKey==pCur
2d340 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20  ->curIntKey );. 
2d350 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
2d360 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78  urIntKey || pIdx
2d370 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  Key );.  for(;;)
2d380 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75  {.    int lwr, u
2d390 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20 20 20 20  pr, idx, c;.    
2d3a0 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20  Pgno chldPg;.   
2d3b0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
2d3c0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
2d3d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20 20 20     u8 *pCell;   
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
2d400 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63 65 6c  r to current cel
2d410 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a 0a 20  l in pPage */.. 
2d420 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e 43 65     /* pPage->nCe
2d430 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65 61 74  ll must be great
2d440 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20 49 66  er than zero. If
2d450 20 74 68 69 73 20 69 73 20 74 68 65 20 72 6f 6f   this is the roo
2d460 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 74 68  t-page.    ** th
2d470 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 68  e cursor would h
2d480 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c 49 44  ave been INVALID
2d490 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69 73 20   above and this 
2d4a0 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20 20 20  for(;;) loop.   
2d4b0 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49 66 20   ** not run. If 
2d4c0 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
2d4d0 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65 6e 20  root-page, then 
2d4e0 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  the moveToChild(
2d4f0 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 2a 2a  ) routine.    **
2d500 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65   would have alre
2d510 61 64 79 20 64 65 74 65 63 74 65 64 20 64 62 20  ady detected db 
2d520 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69 6d 69  corruption. Simi
2d530 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d 75 73  larly, pPage mus
2d540 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68 65 20  t.    ** be the 
2d550 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e 64 65  right kind (inde
2d560 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66 20 62  x or table) of b
2d570 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74 68 65  -tree page. Othe
2d580 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61 20 6d  rwise.    ** a m
2d590 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f 72 20  oveToChild() or 
2d5a0 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63 61 6c  moveToRoot() cal
2d5b0 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64 65 74  l would have det
2d5c0 65 63 74 65 64 20 63 6f 72 72 75 70 74 69 6f 6e  ected corruption
2d5d0 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  .  */.    assert
2d5e0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30  ( pPage->nCell>0
2d5f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2d600 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 28  pPage->intKey==(
2d610 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b 0a 20  pIdxKey==0) );. 
2d620 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20 20     lwr = 0;.    
2d630 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  upr = pPage->nCe
2d640 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  ll-1;.    assert
2d650 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30 20 7c  ( biasRight==0 |
2d660 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31 20 29  | biasRight==1 )
2d670 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70 72 3e  ;.    idx = upr>
2d680 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29 3b 20  >(1-biasRight); 
2d690 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52 69 67  /* idx = biasRig
2d6a0 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77 72 2b  ht ? upr : (lwr+
2d6b0 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 70  upr)/2; */.    p
2d6c0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2d6d0 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52 65 63  dx;.    if( xRec
2d6e0 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20 29 7b  ordCompare==0 ){
2d6f0 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2d700 20 20 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c          i64 nCel
2d710 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43  lKey;.        pC
2d720 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61  ell = findCellPa
2d730 73 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78  stPtr(pPage, idx
2d740 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2d750 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
2d760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68   ){.          wh
2d770 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a 28 70  ile( 0x80 <= *(p
2d780 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20 20 20  Cell++) ){.     
2d790 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
2d7a0 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  >=pPage->aDataEn
2d7b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
2d7c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d7d0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
2d7e0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2d7f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2d800 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2d810 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
2d820 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
2d830 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2d840 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
2d850 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2d860 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2d870 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2d880 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
2d890 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2d8a0 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
2d8b0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d8c0 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2d8e0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
2d8f0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2d900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d910 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2d920 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
2d930 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d940 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  ix = (u16)idx;. 
2d950 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2d960 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d970 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69           lwr = i
2d980 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  dx;.            
2d990 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74  goto moveto_next
2d9a0 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20  _layer;.        
2d9b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2d9c0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
2d9d0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
2d9e0 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  dNKey;.         
2d9f0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
2da00 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
2da10 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d             pCur-
2da20 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2da30 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 52  .            *pR
2da40 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2da50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2da60 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2da70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2da80 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b      assert( lwr+
2da90 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  upr>=0 );.      
2daa0 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72    idx = (lwr+upr
2dab0 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20  )>>1;  /* idx = 
2dac0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2dad0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2dae0 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  e{.      for(;;)
2daf0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
2db00 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ell;  /* Size of
2db10 20 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20   the pCell cell 
2db20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
2db30 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
2db40 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67  CellPastPtr(pPag
2db50 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20  e, idx);..      
2db60 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
2db70 20 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d   supported page-
2db80 73 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79  size is 65536 by
2db90 74 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  tes. This means 
2dba0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
2dbb0 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
2dbc0 65 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74  er of record byt
2dbd0 65 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20  es stored on an 
2dbe0 69 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20  index B-Tree.   
2dbf0 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20       ** page is 
2dc00 6c 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20  less than 16384 
2dc10 62 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65  bytes and may be
2dc20 20 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62   stored as a 2-b
2dc30 79 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76  yte.        ** v
2dc40 61 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f  arint. This info
2dc50 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
2dc60 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76  to attempt to av
2dc70 6f 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20  oid parsing .   
2dc80 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69       ** the enti
2dc90 72 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b  re cell by check
2dca0 69 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65  ing for the case
2dcb0 73 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f  s where the reco
2dcc0 72 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a  rd is .        *
2dcd0 2a 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c  * stored entirel
2dce0 79 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74  y within the b-t
2dcf0 72 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70  ree page by insp
2dd00 65 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  ecting the first
2dd10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62   .        ** 2 b
2dd20 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
2dd30 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2dd40 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65       nCell = pCe
2dd50 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69  ll[0];.        i
2dd60 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d  f( nCell<=pPage-
2dd70 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
2dd80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2dd90 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
2dda0 73 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d  s if the record-
2ddb0 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68  size field of th
2ddc0 65 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20  e cell is a.    
2ddd0 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20        ** single 
2dde0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2ddf0 74 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20  the record fits 
2de00 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2de10 6d 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  main.          *
2de20 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
2de30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2de40 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65  tcase( pCell+nCe
2de50 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61  ll+1==pPage->aDa
2de60 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20  taEnd );.       
2de70 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2de80 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f  mpare(nCell, (vo
2de90 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70  id*)&pCell[1], p
2dea0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2deb0 20 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65   }else if( !(pCe
2dec0 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20  ll[1] & 0x80) . 
2ded0 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65           && (nCe
2dee0 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37  ll = ((nCell&0x7
2def0 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31  f)<<7) + pCell[1
2df00 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ])<=pPage->maxLo
2df10 63 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  cal.        ){. 
2df20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2df30 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2df40 64 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61  d is a 2 byte va
2df50 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2df60 6f 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ord .          *
2df70 2a 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  * fits entirely 
2df80 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72  on the main b-tr
2df90 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20  ee page.  */.   
2dfa0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2dfb0 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d   pCell+nCell+2==
2dfc0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
2dfd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
2dfe0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28   xRecordCompare(
2dff0 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70  nCell, (void*)&p
2e000 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79  Cell[2], pIdxKey
2e010 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e020 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2e030 68 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20  he record flows 
2e040 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72  over onto one or
2e050 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
2e060 61 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20  ages. In.       
2e070 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20     ** this case 
2e080 74 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e  the whole cell n
2e090 65 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65  eeds to be parse
2e0a0 64 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f  d, a buffer allo
2e0b0 63 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  cated.          
2e0c0 2a 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79  ** and accessPay
2e0d0 6c 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72  load() used to r
2e0e0 65 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f  etrieve the reco
2e0f0 72 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  rd into the.    
2e100 20 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20        ** buffer 
2e110 62 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72  before VdbeRecor
2e120 64 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62  dCompare() can b
2e130 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20  e called. .     
2e140 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e150 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f    ** If the reco
2e160 72 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74  rd is corrupt, t
2e170 68 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  he xRecordCompar
2e180 65 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65  e routine may re
2e190 61 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ad.          ** 
2e1a0 75 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74  up to two varint
2e1b0 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
2e1c0 66 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e  f the buffer. An
2e1d0 20 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20   extra 18 .     
2e1e0 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66       ** bytes of
2e1f0 20 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f   padding is allo
2e200 63 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64  cated at the end
2e210 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69   of the buffer i
2e220 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  n.          ** c
2e230 61 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73  ase this happens
2e240 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2e250 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a  void *pCellKey;.
2e260 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63            u8 * c
2e270 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d  onst pCellBody =
2e280 20 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e   pCell - pPage->
2e290 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
2e2a0 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
2e2b0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
2e2c0 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75   pCellBody, &pCu
2e2d0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  r->info);.      
2e2e0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74      nCell = (int
2e2f0 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79  )pCur->info.nKey
2e300 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ;.          test
2e310 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b  case( nCell<0 );
2e320 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65     /* True if ke
2e330 79 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f  y size is 2^32 o
2e340 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20  r more */.      
2e350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2e360 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e  ell==0 );  /* In
2e370 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2e380 20 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20   0x80 0x80 0x00 
2e390 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2e3a0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20  tcase( nCell==1 
2e3b0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2e3c0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2e3d0 78 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20  x80 0x01 */.    
2e3e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e3f0 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20  nCell==2 );  /* 
2e400 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e  Minimum legal in
2e410 64 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a  dex key size */.
2e420 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43            if( nC
2e430 65 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20  ell<2 ){.       
2e440 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2e450 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
2e460 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
2e470 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2e480 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2e490 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2e4a0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2e4b0 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2e4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e4d0 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2e4e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2e4f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
2e500 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
2e510 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2e520 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2e530 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2e540 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2e550 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 63 63          rc = acc
2e560 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
2e570 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69   0, nCell, (unsi
2e580 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c  gned char*)pCell
2e590 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Key, 0);.       
2e5a0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2e5b0 73 20 26 3d 20 7e 42 54 43 46 5f 56 61 6c 69 64  s &= ~BTCF_Valid
2e5c0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  Ovfl;.          
2e5d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e5e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e5f0 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2e600 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2e610 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2e620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e630 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2e640 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43  ompare(nCell, pC
2e650 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  ellKey, pIdxKey)
2e660 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
2e670 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2e680 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  y);.        }.  
2e690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20        assert( . 
2e6a0 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78             (pIdx
2e6b0 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  Key->errCode!=SQ
2e6c0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
2e6d0 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26  c==0).         &
2e6e0 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43  & (pIdxKey->errC
2e6f0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  ode!=SQLITE_NOME
2e700 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65  M || pCur->pBtre
2e710 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  e->db->mallocFai
2e720 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  led).        );.
2e730 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20          if( c<0 
2e740 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2e750 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2e760 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20    }else if( c>0 
2e770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2e780 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2e790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e7a0 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20     assert( c==0 
2e7b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52  );.          *pR
2e7c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  es = 0;.        
2e7d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2e7e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2e7f0 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2e800 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2e810 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2e820 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
2e830 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
2e840 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e850 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2e860 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2e870 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2e880 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2e890 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2e8a0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2e8b0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2e8c0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2e8d0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2e8e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2e8f0 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2e900 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2e910 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2e920 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2e930 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2e940 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2e950 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e960 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e   pCur->ix<pCur->
2e970 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2e980 20 20 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d        pCur->ix =
2e990 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2e9a0 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
2e9b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2e9c0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
2e9d0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2e9e0 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61  }.moveto_next_la
2e9f0 79 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72  yer:.    if( lwr
2ea00 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2ea10 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d  {.      chldPg =
2ea20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2ea30 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2ea40 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2ea50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
2ea60 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2ea70 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
2ea80 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20   lwr));.    }.  
2ea90 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2eaa0 36 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20  6)lwr;.    rc = 
2eab0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2eac0 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69  , chldPg);.    i
2ead0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
2eae0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
2eaf0 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  :.  pCur->info.n
2eb00 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61 73 73 65  Size = 0;.  asse
2eb10 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2eb20 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2eb30 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 72 65  Ovfl)==0 );.  re
2eb40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
2eb50 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2eb60 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2eb70 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  not pointing at 
2eb80 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20  an entry of the 
2eb90 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55  table..**.** TRU
2eba0 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  E will be return
2ebb0 65 64 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ed after a call 
2ebc0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  to sqlite3BtreeN
2ebd0 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70  ext() moves.** p
2ebe0 61 73 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74  ast the last ent
2ebf0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ry in the table 
2ec00 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
2ec10 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74  rev() moves past
2ec20 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e  .** the first en
2ec30 74 72 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c  try.  TRUE is al
2ec40 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
2ec50 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
2ec60 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2ec70 33 42 74 72 65 65 45 6f 66 28 42 74 43 75 72 73  3BtreeEof(BtCurs
2ec80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
2ec90 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68  TODO: What if th
2eca0 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43  e cursor is in C
2ecb0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2ecc0 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20  K but all table 
2ecd0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76  entries.  ** hav
2ece0 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20  e been deleted? 
2ecf0 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65  This API will ne
2ed00 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20  ed to change to 
2ed10 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2ed20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c  code.  ** as wel
2ed30 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e  l as the boolean
2ed40 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20   result value.. 
2ed50 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55   */.  return (CU
2ed60 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72  RSOR_VALID!=pCur
2ed70 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a  ->eState);.}../*
2ed80 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 73  .** Return an es
2ed90 74 69 6d 61 74 65 20 66 6f 72 20 74 68 65 20 6e  timate for the n
2eda0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
2edb0 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2edc0 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f 69 6e 74  pCur is.** point
2edd0 69 6e 67 20 74 6f 2e 20 20 52 65 74 75 72 6e 20  ing to.  Return 
2ede0 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  a negative numbe
2edf0 72 20 69 66 20 6e 6f 20 65 73 74 69 6d 61 74 65  r if no estimate
2ee00 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a   is currently .*
2ee10 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a  * available..*/.
2ee20 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
2ee30 52 6f 77 43 6f 75 6e 74 45 73 74 28 42 74 43 75  RowCountEst(BtCu
2ee40 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69  rsor *pCur){.  i
2ee50 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b 0a 0a 20  64 n;.  u8 i;.. 
2ee60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2ee70 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2ee80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2ee90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2eea0 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2eeb0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2eec0 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74 68   /* Currently th
2eed0 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  is interface is 
2eee0 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 74  only called by t
2eef0 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c 65 72 0a  he OP_IfSmaller.
2ef00 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20 61 6e 64    ** opcode, and
2ef10 20 69 74 20 74 68 61 74 20 63 61 73 65 20 74 68   it that case th
2ef20 65 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 61 6c  e cursor will al
2ef30 77 61 79 73 20 62 65 20 76 61 6c 69 64 20 61 6e  ways be valid an
2ef40 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61 6c 77 61  d.  ** will alwa
2ef50 79 73 20 70 6f 69 6e 74 20 74 6f 20 61 20 6c 65  ys point to a le
2ef60 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20 20 69 66  af node. */.  if
2ef70 28 20 4e 45 56 45 52 28 70 43 75 72 2d 3e 65 53  ( NEVER(pCur->eS
2ef80 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2ef90 49 44 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ID) ) return -1;
2efa0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2efb0 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  r->pPage->leaf==
2efc0 30 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  0) ) return -1;.
2efd0 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e 70 50 61  .  n = pCur->pPa
2efe0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 66 6f 72  ge->nCell;.  for
2eff0 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50  (i=0; i<pCur->iP
2f000 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  age; i++){.    n
2f010 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65   *= pCur->apPage
2f020 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  [i]->nCell;.  }.
2f030 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
2f040 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
2f050 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e   cursor to the n
2f060 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ext entry in the
2f070 20 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 20 52   database. .** R
2f080 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a 2a 2a 0a  eturn value:.**.
2f090 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20  **    SQLITE_OK 
2f0a0 20 20 20 20 20 20 20 73 75 63 63 65 73 73 0a 2a         success.*
2f0b0 2a 20 20 20 20 53 51 4c 49 54 45 5f 44 4f 4e 45  *    SQLITE_DONE
2f0c0 20 20 20 20 20 20 63 75 72 73 6f 72 20 69 73 20        cursor is 
2f0d0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2f0e0 20 61 74 20 74 68 65 20 6c 61 73 74 20 65 6c 65   at the last ele
2f0f0 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74 68 65 72  ment.**    other
2f100 77 69 73 65 20 20 20 20 20 20 20 20 73 6f 6d 65  wise        some
2f110 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f   kind of error o
2f120 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68  ccurred.**.** Th
2f130 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2f140 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2f150 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2f160 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2f170 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2f180 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2f190 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2f1a0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2f1b0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2f1c0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2f1d0 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2f1e0 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2f1f0 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2f200 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2f210 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2f220 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2f230 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2f240 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2f250 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2f260 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2f270 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30 78 30  **.** If bit 0x0
2f280 31 20 6f 66 20 74 68 65 20 46 20 61 72 67 75 6d  1 of the F argum
2f290 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ent in sqlite3Bt
2f2a0 72 65 65 4e 65 78 74 28 43 2c 46 29 20 69 73 20  reeNext(C,F) is 
2f2b0 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 63  1, then the.** c
2f2c0 75 72 73 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64  ursor correspond
2f2d0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2f2e0 78 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  x and this routi
2f2f0 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65  ne could have be
2f300 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64 20 69 66  en.** skipped if
2f310 20 74 68 65 20 53 51 4c 20 69 6e 64 65 78 20 68   the SQL index h
2f320 61 64 20 62 65 65 6e 20 61 20 75 6e 69 71 75 65  ad been a unique
2f330 20 69 6e 64 65 78 2e 20 20 54 68 65 20 46 20 61   index.  The F a
2f340 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 61 20  rgument.** is a 
2f350 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
2f360 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74 65 20 62  ement.  SQLite b
2f370 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2f380 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ion does not use
2f390 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74 2c 20 62  .** this hint, b
2f3a0 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e 0a  ut COMDB2 does..
2f3b0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2f3c0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2f3d0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2f3e0 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
2f3f0 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  c;.  int idx;.  
2f400 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2f410 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2f420 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2f430 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2f440 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2f450 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2f460 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2f470 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2f480 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2f490 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2f4a0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2f4b0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2f4c0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2f4d0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2f4e0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2f4f0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2f500 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f510 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2f520 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2f530 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2f540 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2f550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
2f560 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NE;.    }.    if
2f570 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2f580 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2f590 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2f5a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2f5b0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2f5c0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2f5d0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2f5e0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2f5f0 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2f600 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2f610 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2f620 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2f630 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2f640 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2f650 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2f660 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2f670 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2f680 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 64  Cur->pPage;.  id
2f690 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b 0a  x = ++pCur->ix;.
2f6a0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73    if( !pPage->is
2f6b0 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54  Init ){.    /* T
2f6c0 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77 61  he only known wa
2f6d0 79 20 66 6f 72 20 74 68 69 73 20 74 6f 20 68 61  y for this to ha
2f6e0 70 70 65 6e 20 69 73 20 66 6f 72 20 74 68 65 72  ppen is for ther
2f6f0 65 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a 2a  e to be a.    **
2f700 20 72 65 63 75 72 73 69 76 65 20 53 51 4c 20 66   recursive SQL f
2f710 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f 65  unction that doe
2f720 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72 61  s a DELETE opera
2f730 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66 20  tion as part of 
2f740 61 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20  a.    ** SELECT 
2f750 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 63 6f  which deletes co
2f760 6e 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20 75  ntent out from u
2f770 6e 64 65 72 20 61 6e 20 61 63 74 69 76 65 20 63  nder an active c
2f780 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 20  ursor.    ** in 
2f790 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
2f7a0 73 65 20 66 69 6c 65 20 77 68 65 72 65 20 74 68  se file where th
2f7b0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 44 45  e table being DE
2f7c0 4c 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20 20  LETE-ed from.   
2f7d0 20 2a 2a 20 68 61 73 20 70 61 67 65 73 20 69 6e   ** has pages in
2f7e0 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68 65   common with the
2f7f0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75 65   table being que
2f800 72 69 65 64 2e 20 20 53 65 65 20 54 48 33 0a 20  ried.  See TH3. 
2f810 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f 76     ** module cov
2f820 31 2f 62 74 72 65 65 37 38 2e 74 65 73 74 20 74  1/btree78.test t
2f830 65 73 74 63 61 73 65 20 32 32 30 20 28 32 30 31  estcase 220 (201
2f840 38 2d 30 36 2d 30 38 29 20 66 6f 72 20 61 6e 0a  8-06-08) for an.
2f850 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e 20      ** example. 
2f860 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
2f870 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2f880 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  T;.  }..  /* If 
2f890 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f8a0 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69 74  e is corrupt, it
2f8b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
2f8c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69 64   the value of id
2f8d0 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69 6e  x .  ** to be in
2f8e0 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69 73  valid here. This
2f8f0 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 20   can only occur 
2f900 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72 73  if a second curs
2f910 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a 2a  or modifies.  **
2f920 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65 20   the page while 
2f930 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 68  cursor pCur is h
2f940 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
2f950 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68 20  ce to it. Which 
2f960 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68 61  can.  ** only ha
2f970 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74 61  ppen if the data
2f980 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74 20  base is corrupt 
2f990 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
2f9a0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20 2a   to link the.  *
2f9b0 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72 65  * page into more
2f9c0 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65 65   than one b-tree
2f9d0 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20   structure. */. 
2f9e0 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e 70   testcase( idx>p
2f9f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  Page->nCell );..
2fa00 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67 65    if( idx>=pPage
2fa10 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 69  ->nCell ){.    i
2fa20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2fa30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  ){.      rc = mo
2fa40 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2fa50 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2fa60 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2fa70 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2fa80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2fa90 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 65  urn rc;.      re
2faa0 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  turn moveToLeftm
2fab0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
2fac0 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69  .    do{.      i
2fad0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2fae0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2faf0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2fb00 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2fb10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fb20 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
2fb30 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2fb40 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
2fb50 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2fb60 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  age;.    }while(
2fb70 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67 65   pCur->ix>=pPage
2fb80 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2fb90 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2fba0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fbb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2fbc0 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  t(pCur, 0);.    
2fbd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
2fbe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2fbf0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
2fc00 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fc10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fc20 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2fc30 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2fc40 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2fc50 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  }.}.int sqlite3B
2fc60 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f  treeNext(BtCurso
2fc70 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
2fc80 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  gs){.  MemPage *
2fc90 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44 5f  pPage;.  UNUSED_
2fca0 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67 73  PARAMETER( flags
2fcb0 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e 20   );  /* Used in 
2fcc0 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20 6e  COMDB2 but not n
2fcd0 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f 0a  ative SQLite */.
2fce0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2fcf0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2fd00 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2fd10 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
2fd20 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2fd30 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2fd40 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2fd50 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2fd60 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2fd70 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2fd80 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2fd90 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2fda0 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2fdb0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
2fdc0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2fdd0 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74 72  LID ) return btr
2fde0 65 65 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20  eeNext(pCur);.  
2fdf0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
2fe00 61 67 65 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  age;.  if( (++pC
2fe10 75 72 2d 3e 69 78 29 3e 3d 70 50 61 67 65 2d 3e  ur->ix)>=pPage->
2fe20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2fe30 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 72 65 74  r->ix--;.    ret
2fe40 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2fe50 75 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ur);.  }.  if( p
2fe60 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2fe70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fe80 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
2fe90 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65   return moveToLe
2fea0 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2feb0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  }.}../*.** Step 
2fec0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2fed0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
2fee0 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
2fef0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
2ff00 20 52 65 74 75 72 6e 20 76 61 6c 75 65 73 3a 0a   Return values:.
2ff10 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  **.**     SQLITE
2ff20 5f 4f 4b 20 20 20 20 20 73 75 63 63 65 73 73 0a  _OK     success.
2ff30 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 44 4f  **     SQLITE_DO
2ff40 4e 45 20 20 20 74 68 65 20 63 75 72 73 6f 72 20  NE   the cursor 
2ff50 69 73 20 61 6c 72 65 61 64 79 20 6f 6e 20 74 68  is already on th
2ff60 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
2ff70 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
2ff80 20 20 20 20 6f 74 68 65 72 77 69 73 65 20 20 20      otherwise   
2ff90 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65    some kind of e
2ffa0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a  rror occurred.**
2ffb0 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2ffc0 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2ffd0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
2ffe0 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e  ().  That routin
2fff0 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a  e is optimized.*
30000 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  * for the common
30010 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20   case of merely 
30020 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  decrementing the
30030 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74   cell counter Bt
30040 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20  Cursor.aiIdx.** 
30050 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
30060 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
30070 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
30080 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65  slower) btreePre
30090 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65  vious().** helpe
300a0 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  r routine is cal
300b0 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e  led when it is n
300c0 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65  ecessary to move
300d0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
300e0 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65  page.** or to re
300f0 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
30100 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20 30  ..**.** If bit 0
30110 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72 67  x01 of the F arg
30120 75 6d 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33  ument to sqlite3
30130 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 43 2c  BtreePrevious(C,
30140 46 29 20 69 73 20 31 2c 20 74 68 65 6e 0a 2a 2a  F) is 1, then.**
30150 20 74 68 65 20 63 75 72 73 6f 72 20 63 6f 72 72   the cursor corr
30160 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51  esponds to an SQ
30170 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73  L index and this
30180 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
30190 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70  ave been.** skip
301a0 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69  ped if the SQL i
301b0 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20  ndex had been a 
301c0 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54  unique index.  T
301d0 68 65 20 46 20 61 72 67 75 6d 65 6e 74 20 69 73  he F argument is
301e0 20 61 0a 2a 2a 20 68 69 6e 74 20 74 6f 20 74 68   a.** hint to th
301f0 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 54 68  e implement.  Th
30200 65 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  e native SQLite 
30210 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61  btree implementa
30220 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  tion does not.**
30230 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
30240 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65 73 2e  but COMDB2 does.
30250 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
30260 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62  E_NOINLINE int b
30270 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
30280 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
30290 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
302a0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
302b0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
302c0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
302d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
302e0 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
302f0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
30300 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
30310 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
30320 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
30330 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
30340 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
30350 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61  NKey))==0 );.  a
30360 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
30370 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
30380 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
30390 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
303a0 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  {.    rc = resto
303b0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
303c0 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
303d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
303e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
303f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30400 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
30410 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
30420 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30430 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
30440 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
30450 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
30460 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
30470 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
30480 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
30490 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
304a0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
304b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
304c0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
304d0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
304e0 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
304f0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
30500 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
30510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
30520 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
30530 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
30540 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
30550 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30560 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
30570 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
30580 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
30590 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
305a0 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20 20 72   pCur->ix;.    r
305b0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
305c0 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
305d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
305e0 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
305f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
30600 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
30610 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
30620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
30630 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30 20 29  e( pCur->ix==0 )
30640 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
30650 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
30660 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
30670 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
30680 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
30690 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
306a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
306b0 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
306c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
306d0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
306e0 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
306f0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
30700 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
30710 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29  ValidOvfl))==0 )
30720 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 2d  ;..    pCur->ix-
30730 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  -;.    pPage = p
30740 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
30750 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
30760 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
30770 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
30780 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
30790 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b 0a 20  ious(pCur, 0);. 
307a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
307b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
307c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
307d0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
307e0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
307f0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
30800 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
30810 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
30820 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
30830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
30840 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  ags==0 || flags=
30850 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
30860 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
30870 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
30880 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
30890 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
308a0 4d 45 54 45 52 28 20 66 6c 61 67 73 20 29 3b 20  METER( flags ); 
308b0 20 2f 2a 20 55 73 65 64 20 69 6e 20 43 4f 4d 44   /* Used in COMD
308c0 42 32 20 62 75 74 20 6e 6f 74 20 6e 61 74 69 76  B2 but not nativ
308d0 65 20 53 51 4c 69 74 65 20 2a 2f 0a 20 20 70 43  e SQLite */.  pC
308e0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
308f0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
30900 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
30910 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
30920 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
30930 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
30940 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30950 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
30960 72 2d 3e 69 78 3d 3d 30 0a 20 20 20 7c 7c 20 70  r->ix==0.   || p
30970 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61 66  Cur->pPage->leaf
30980 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
30990 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
309a0 73 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70  s(pCur);.  }.  p
309b0 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 72 65 74  Cur->ix--;.  ret
309c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
309d0 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
309e0 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f 6d   a new page from
309f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30a00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  le..**.** The ne
30a10 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65 64  w page is marked
30a20 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e 20   as dirty.  (In 
30a30 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71 6c  other words, sql
30a40 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
30a50 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
30a60 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
30a70 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20 54  he new page.)  T
30a80 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73 20  he new page has 
30a90 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66  also.** been ref
30aa0 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65 20  erenced and the 
30ab0 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
30ac0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
30ad0 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71  or calling.** sq
30ae0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
30af0 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  ) on the new pag
30b00 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e  e when it is don
30b10 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
30b20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f  OK is returned o
30b30 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79 20  n success.  Any 
30b40 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c  other return val
30b50 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20  ue indicates.** 
30b60 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50 61  an error.  *ppPa
30b70 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
30b80 4c 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f  L in the event o
30b90 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  f an error..**.*
30ba0 2a 20 49 66 20 74 68 65 20 22 6e 65 61 72 62 79  * If the "nearby
30bb0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  " parameter is n
30bc0 6f 74 20 30 2c 20 74 68 65 6e 20 61 6e 20 65 66  ot 0, then an ef
30bd0 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
30be0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
30bf0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
30c00 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
30c10 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
30c20 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
30c30 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
30c40 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
30c50 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
30c60 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
30c70 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
30c80 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
30c90 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
30ca0 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
30cb0 49 66 20 74 68 65 20 65 4d 6f 64 65 20 70 61 72  If the eMode par
30cc0 61 6d 65 74 65 72 20 69 73 20 42 54 41 4c 4c 4f  ameter is BTALLO
30cd0 43 5f 45 58 41 43 54 20 61 6e 64 20 74 68 65 20  C_EXACT and the 
30ce0 6e 65 61 72 62 79 20 70 61 67 65 20 65 78 69 73  nearby page exis
30cf0 74 73 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f  ts.** anywhere o
30d00 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c  n the free-list,
30d10 20 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72   then it is guar
30d20 61 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74  anteed to be ret
30d30 75 72 6e 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d  urned.  If.** eM
30d40 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c  ode is BTALLOC_L
30d50 54 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  T then the page 
30d60 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 62 65  returned will be
30d70 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
30d80 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79  ual.** to nearby
30d90 20 69 66 20 61 6e 79 20 73 75 63 68 20 70 61 67   if any such pag
30da0 65 20 65 78 69 73 74 73 2e 20 20 49 66 20 65 4d  e exists.  If eM
30db0 6f 64 65 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41  ode is BTALLOC_A
30dc0 4e 59 20 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a  NY then there.**
30dd0 20 61 72 65 20 6e 6f 20 72 65 73 74 72 69 63 74   are no restrict
30de0 69 6f 6e 73 20 6f 6e 20 77 68 69 63 68 20 70 61  ions on which pa
30df0 67 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ge is returned..
30e00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
30e10 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
30e20 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
30e30 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
30e40 20 62 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   btree */.  MemP
30e50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
30e60 20 20 20 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e     /* Store poin
30e70 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
30e80 61 74 65 64 20 70 61 67 65 20 68 65 72 65 20 2a  ated page here *
30e90 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c  /.  Pgno *pPgno,
30ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
30eb0 6f 72 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ore the page num
30ec0 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 50 67  ber here */.  Pg
30ed0 6e 6f 20 6e 65 61 72 62 79 2c 20 20 20 20 20 20  no nearby,      
30ee0 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
30ef0 6f 72 20 61 20 70 61 67 65 20 6e 65 61 72 20 74  or a page near t
30f00 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20  his one */.  u8 
30f10 65 4d 6f 64 65 20 20 20 20 20 20 20 20 20 20 20  eMode           
30f20 20 20 20 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45      /* BTALLOC_E
30f30 58 41 43 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54  XACT, BTALLOC_LT
30f40 2c 20 6f 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  , or BTALLOC_ANY
30f50 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
30f60 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
30f70 72 63 3b 0a 20 20 75 33 32 20 6e 3b 20 20 20 20  rc;.  u32 n;    
30f80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
30f90 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
30fa0 69 73 74 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20  ist */.  u32 k; 
30fb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
30fc0 20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74   leaves on the t
30fd0 72 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65  runk of the free
30fe0 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  list */.  MemPag
30ff0 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  e *pTrunk = 0;. 
31000 20 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54   MemPage *pPrevT
31010 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f  runk = 0;.  Pgno
31020 20 6d 78 50 61 67 65 3b 20 20 20 20 20 2f 2a 20   mxPage;     /* 
31030 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  Total size of th
31040 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
31050 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
31060 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
31070 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
31080 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
31090 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20  =BTALLOC_ANY || 
310a0 28 6e 65 61 72 62 79 3e 30 20 26 26 20 49 66 4e  (nearby>0 && IfN
310b0 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 61 75  otOmitAV(pBt->au
310c0 74 6f 56 61 63 75 75 6d 29 29 20 29 3b 0a 20 20  toVacuum)) );.  
310d0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
310e0 61 67 65 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d  age1;.  mxPage =
310f0 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
31100 70 42 74 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  pBt);.  /* EVIDE
31110 4e 43 45 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d  NCE-OF: R-05119-
31120 30 32 36 33 37 20 54 68 65 20 34 2d 62 79 74 65  02637 The 4-byte
31130 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
31140 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 36  ger at offset 36
31150 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f  .  ** stores sto
31160 72 65 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  res the total nu
31170 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
31180 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 2a   the freelist. *
31190 2f 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  /.  n = get4byte
311a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
311b0 33 36 5d 29 3b 0a 20 20 74 65 73 74 63 61 73 65  36]);.  testcase
311c0 28 20 6e 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b  ( n==mxPage-1 );
311d0 0a 20 20 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65  .  if( n>=mxPage
311e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
311f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
31200 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e  PT;.  }.  if( n>
31210 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
31220 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
31230 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
31240 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
31250 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
31260 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
31270 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
31280 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
31290 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
312a0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
312b0 72 62 79 27 20 2a 2f 0a 20 20 20 20 75 33 32 20  rby' */.    u32 
312c0 6e 53 65 61 72 63 68 20 3d 20 30 3b 20 20 20 2f  nSearch = 0;   /
312d0 2a 20 43 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  * Count of the n
312e0 75 6d 62 65 72 20 6f 66 20 73 65 61 72 63 68 20  umber of search 
312f0 61 74 74 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20  attempts */.    
31300 0a 20 20 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65  .    /* If eMode
31310 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20  ==BTALLOC_EXACT 
31320 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
31330 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
31340 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
31350 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
31360 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
31370 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
31380 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
31390 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
313a0 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
313b0 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
313c0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
313d0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
313e0 55 55 4d 0a 20 20 20 20 69 66 28 20 65 4d 6f 64  UUM.    if( eMod
313f0 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54  e==BTALLOC_EXACT
31400 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
31410 61 72 62 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a  arby<=mxPage ){.
31420 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
31430 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
31440 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
31450 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
31460 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
31470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
31480 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e 65 61  rmapGet(pBt, nea
31490 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30 29 3b  rby, &eType, 0);
314a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
314b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
314c0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
314d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
314e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65 61  ){.          sea
314f0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
31500 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
31510 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f     }else if( eMo
31520 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29  de==BTALLOC_LE )
31530 7b 0a 20 20 20 20 20 20 73 65 61 72 63 68 4c 69  {.      searchLi
31540 73 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  st = 1;.    }.#e
31550 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
31560 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
31570 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
31580 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
31590 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
315a0 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
315b0 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
315c0 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
315d0 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
315e0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
315f0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31600 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
31610 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
31620 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
31630 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31640 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
31650 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
31660 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
31670 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
31680 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
31690 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
316a0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
316b0 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
316c0 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
316d0 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
316e0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
316f0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
31700 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
31710 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
31720 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43  de==BTALLOC_EXAC
31730 54 29 0a 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74  T).    ** or unt
31740 69 6c 20 61 20 70 61 67 65 20 6c 65 73 73 20 74  il a page less t
31750 68 61 6e 20 27 6e 65 61 72 62 79 27 20 69 73 20  han 'nearby' is 
31760 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d  located (eMode==
31770 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20  BTALLOC_LT).    
31780 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  */.    do {.    
31790 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 70    pPrevTrunk = p
317a0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28  Trunk;.      if(
317b0 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20   pPrevTrunk ){. 
317c0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
317d0 43 45 2d 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31  CE-OF: R-01506-1
317e0 31 30 35 33 20 54 68 65 20 66 69 72 73 74 20 69  1053 The first i
317f0 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
31800 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
31810 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68          ** is th
31820 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
31830 20 74 68 65 20 6e 65 78 74 20 66 72 65 65 6c 69   the next freeli
31840 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31850 20 74 68 65 20 6c 69 73 74 20 6f 72 0a 20 20 20   the list or.   
31860 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20       ** zero if 
31870 74 68 69 73 20 69 73 20 74 68 65 20 6c 61 73 74  this is the last
31880 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31890 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
318a0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
318b0 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  te(&pPrevTrunk->
318c0 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
318d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
318e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
318f0 52 2d 35 39 38 34 31 2d 31 33 37 39 38 20 54 68  R-59841-13798 Th
31900 65 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  e 4-byte big-end
31910 69 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f  ian integer at o
31920 66 66 73 65 74 20 33 32 0a 20 20 20 20 20 20 20  ffset 32.       
31930 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 70   ** stores the p
31940 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
31950 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
31960 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 6f 72  the freelist, or
31970 20 7a 65 72 6f 20 69 66 0a 20 20 20 20 20 20 20   zero if.       
31980 20 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74   ** the freelist
31990 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20   is empty. */.  
319a0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
319b0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
319c0 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20  >aData[32]);.   
319d0 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74 63     }.      testc
319e0 61 73 65 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50  ase( iTrunk==mxP
319f0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  age );.      if(
31a00 20 69 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c   iTrunk>mxPage |
31a10 7c 20 6e 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20  | nSearch++ > n 
31a20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
31a30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
31a40 47 4e 4f 28 70 50 72 65 76 54 72 75 6e 6b 20 3f  GNO(pPrevTrunk ?
31a50 20 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 67 6e   pPrevTrunk->pgn
31a60 6f 20 3a 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  o : 1);.      }e
31a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
31a80 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
31a90 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
31aa0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
31ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31ac0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70   rc ){.        p
31ad0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20  Trunk = 0;.     
31ae0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31af0 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
31b00 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
31b10 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20 20   pTrunk!=0 );.  
31b20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75      assert( pTru
31b30 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b 0a  nk->aData!=0 );.
31b40 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
31b50 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30 34  E-OF: R-13523-04
31b60 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20 69  394 The second i
31b70 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65 65  nteger on a free
31b80 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a  list trunk page.
31b90 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20        ** is the 
31ba0 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  number of leaf p
31bb0 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  age pointers to 
31bc0 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20 20  follow. */.     
31bd0 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   k = get4byte(&p
31be0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
31bf0 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30  ;.      if( k==0
31c00 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74 20   && !searchList 
31c10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
31c20 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20 6c  e trunk has no l
31c30 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c 69  eaves and the li
31c40 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67 20  st is not being 
31c50 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20 20  searched. .     
31c60 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63 74     ** So extract
31c70 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
31c80 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20 69  itself and use i
31c90 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20 0a  t as the newly .
31ca0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63          ** alloc
31cb0 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20  ated page */.   
31cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
31cd0 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20  evTrunk==0 );.  
31ce0 20 20 20 20 20 20 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 54 72  e3PagerWrite(pTr
31d00 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
31d10 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
31d20 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
31d30 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31d40 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
31d50 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54       *pPgno = iT
31d60 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d 65  runk;.        me
31d70 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
31d80 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
31d90 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
31da0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
31db0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
31dc0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
31dd0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
31de0 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
31df0 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
31e00 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
31e10 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d  , n-1));.      }
31e20 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32 29  else if( k>(u32)
31e30 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
31e40 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20 20  /4 - 2) ){.     
31e50 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
31e60 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
31e70 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
31e80 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
31e90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31ea0 52 52 55 50 54 5f 50 47 4e 4f 28 69 54 72 75 6e  RRUPT_PGNO(iTrun
31eb0 6b 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  k);.        goto
31ec0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
31ed0 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ge;.#ifndef SQLI
31ee0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31ef0 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  UM.      }else i
31f00 66 28 20 73 65 61 72 63 68 4c 69 73 74 20 0a 20  f( searchList . 
31f10 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e             && (n
31f20 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 7c 7c  earby==iTrunk ||
31f30 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62 79 20   (iTrunk<nearby 
31f40 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
31f50 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 29 7b  C_LE)) .      ){
31f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
31f70 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65  list is being se
31f80 61 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20  arched and this 
31f90 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68  trunk page is th
31fa0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
31fb0 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72  * to allocate, r
31fc0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
31fd0 74 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76  ther it has leav
31fe0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
31ff0 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
32000 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
32010 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b  *ppPage = pTrunk
32020 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68  ;.        search
32030 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
32040 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32050 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
32060 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
32070 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
32080 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
32090 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
320a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
320b0 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20   if( k==0 ){.   
320c0 20 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65         if( !pPre
320d0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
320e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
320f0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32100 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
32110 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
32120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32130 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32140 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
32150 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
32160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
32170 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32180 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32190 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
321a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
321b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
321c0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76     memcpy(&pPrev
321d0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
321e0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
321f0 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  0], 4);.        
32200 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
32210 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
32220 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  The trunk page i
32230 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  s required by th
32240 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20  e caller but it 
32250 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20  contains .      
32260 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20      ** pointers 
32270 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61  to free-list lea
32280 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c  ves. The first l
32290 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72  eaf becomes a tr
322a0 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  unk.          **
322b0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
322c0 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  se..          */
322d0 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61  .          MemPa
322e0 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20  ge *pNewTrunk;. 
322f0 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e           Pgno iN
32300 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79  ewTrunk = get4by
32310 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
32320 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  a[8]);.         
32330 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b 3e 6d   if( iNewTrunk>m
32340 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20 20 20  xPage ){ .      
32350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
32360 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69  E_CORRUPT_PGNO(i
32370 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
32380 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32390 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
323a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
323b0 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65 77    testcase( iNew
323c0 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b  Trunk==mxPage );
323d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
323e0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
323f0 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
32400 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
32410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
32420 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32430 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
32440 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32450 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
32460 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
32470 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32480 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
32490 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
324a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
324b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
324c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
324d0 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
324e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
324f0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
32500 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
32510 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
32520 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
32530 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
32540 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
32550 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
32560 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
32570 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
32580 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
32590 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
325a0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
325b0 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
325c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
325d0 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
325e0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
325f0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
32600 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
32610 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
32620 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d 3e  iteable(pPage1->
32630 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
32640 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32650 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
32660 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
32670 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
32680 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
32690 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
326a0 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
326b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
326c0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
326d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
326e0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
326f0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
32700 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
32710 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
32720 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32730 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
32740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32750 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
32760 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
32770 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
32780 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
32790 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
327a0 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
327b0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
327c0 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b 0a  else if( k>0 ){.
327d0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61          /* Extra
327e0 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74  ct a leaf from t
327f0 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20  he trunk */.    
32800 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74 3b      u32 closest;
32810 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50  .        Pgno iP
32820 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73  age;.        uns
32830 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74  igned char *aDat
32840 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74  a = pTrunk->aDat
32850 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  a;.        if( n
32860 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20 20  earby>0 ){.     
32870 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20       u32 i;.    
32880 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
32890 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  0;.          if(
328a0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
328b0 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LE ){.          
328c0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20    for(i=0; i<k; 
328d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
328e0 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
328f0 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
32900 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  4]);.           
32910 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e 65     if( iPage<=ne
32920 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20 20  arby ){.        
32930 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
32940 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = i;.           
32950 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
32960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32990 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74 3b         int dist;
329a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73  .            dis
329b0 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  t = sqlite3AbsIn
329c0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
329d0 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62 79  ata[8]) - nearby
329e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
329f0 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b  or(i=1; i<k; i++
32a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
32a10 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
32a20 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79  3AbsInt32(get4by
32a30 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34 5d  te(&aData[8+i*4]
32a40 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
32a50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
32a60 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20  2<dist ){.      
32a70 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
32a80 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
32a90 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64 32         dist = d2
32aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32ab0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
32ac0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32ae0 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 30       closest = 0
32af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
32b00 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
32b10 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 63  4byte(&aData[8+c
32b20 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20  losest*4]);.    
32b30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
32b40 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
32b50 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65         if( iPage
32b60 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 20  >mxPage ){.     
32b70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32b80 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28 69 54  _CORRUPT_PGNO(iT
32b90 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
32ba0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32bb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32bc0 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73 74 63   }.        testc
32bd0 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
32be0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
32bf0 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 0a 20  ( !searchList . 
32c00 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50 61 67          || (iPag
32c10 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28 69 50  e==nearby || (iP
32c20 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  age<nearby && eM
32c30 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
32c40 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  ) .        ){.  
32c50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f 43 6f          int noCo
32c60 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  ntent;.         
32c70 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b   *pPgno = iPage;
32c80 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
32c90 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
32ca0 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25  was leaf %d of %
32cb0 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20  d on trunk %d". 
32cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cd0 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20  ": %d more free 
32ce0 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  pages\n",.      
32cf0 20 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e             *pPgn
32d00 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c  o, closest+1, k,
32d10 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e   pTrunk->pgno, n
32d20 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
32d30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
32d40 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
32d50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32d60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
32d70 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32d80 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ge;.          if
32d90 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
32da0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
32db0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
32dc0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
32dd0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
32de0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32df0 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
32e00 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
32e10 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e 74 20        noContent 
32e20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73 43 6f  = !btreeGetHasCo
32e30 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50 67 6e  ntent(pBt, *pPgn
32e40 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  o)? PAGER_GET_NO
32e50 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20 20 20  CONTENT : 0;.   
32e60 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
32e70 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
32e80 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
32e90 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
32ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32ec0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32ed0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32ee0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
32ef0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32f00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32f10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32f20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
32f30 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
32f40 20 20 20 20 20 20 20 20 20 20 2a 70 70 50 61 67            *ppPag
32f50 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
32f60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
32f70 0a 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63  .          searc
32f80 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  hList = 0;.     
32f90 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32fa0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
32fb0 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 20 20  PrevTrunk);.    
32fc0 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30    pPrevTrunk = 0
32fd0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 65  ;.    }while( se
32fe0 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20 7d 65  archList );.  }e
32ff0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  lse{.    /* Ther
33000 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73 20 6f  e are no pages o
33010 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  n the freelist, 
33020 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65 77 20  so append a new 
33030 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20 20 20  page to the.    
33040 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
33050 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
33060 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77 20 70   Normally, new p
33070 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  ages allocated b
33080 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63 61 6e  y this block can
33090 20 62 65 20 72 65 71 75 65 73 74 65 64 20 66 72   be requested fr
330a0 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  om the.    ** pa
330b0 67 65 72 20 6c 61 79 65 72 20 77 69 74 68 20 74  ger layer with t
330c0 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20  he 'no-content' 
330d0 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73 20 70  flag set. This p
330e0 72 65 76 65 6e 74 73 20 74 68 65 20 70 61 67 65  revents the page
330f0 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 72  r.    ** from tr
33100 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74 68 65  ying to read the
33110 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74 20 66   pages content f
33120 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65 76 65  rom disk. Howeve
33130 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  r, if the.    **
33140 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
33150 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
33160 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   run one or more
33170 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63   incremental-vac
33180 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65 70 73  uum.    ** steps
33190 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
331a0 77 65 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20  we are about to 
331b0 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63 6f 6e  allocate may con
331c0 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20 20 20  tain content.   
331d0 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65 71 75   ** that is requ
331e0 69 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ired in the even
331f0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
33200 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 64   In this case, d
33210 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73 65 74  o.    ** not set
33220 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
33230 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75 73 65  flag. This cause
33240 73 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 6c  s the pager to l
33250 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 0a  oad and journal.
33260 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65      ** the curre
33270 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  nt page content 
33280 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74 69  before overwriti
33290 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  ng it..    **.  
332a0 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
332b0 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 6e 6f  he pager will no
332c0 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74 65 6d  t actually attem
332d0 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20 6a 6f  pt to load or jo
332e0 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20 63 6f  urnal .    ** co
332f0 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 70 61  ntent for any pa
33300 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79 20 64  ge that really d
33310 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74 68 65  oes lie past the
33320 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
33330 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
33340 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74 68 65   on disk. So the
33350 20 65 66 66 65 63 74 73 20 6f 66 20 64 69 73 61   effects of disa
33360 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63 6f 6e  bling the no-con
33370 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74 69 6f  tent optimizatio
33380 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20 61 72  n.    ** here ar
33390 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20 74 68  e confined to th
333a0 6f 73 65 20 70 61 67 65 73 20 74 68 61 74 20 6c  ose pages that l
333b0 69 65 20 62 65 74 77 65 65 6e 20 74 68 65 20 65  ie between the e
333c0 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  nd of the.    **
333d0 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
333e0 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66 20 74  and the end of t
333f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
33410 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20 28 30   bNoContent = (0
33420 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  ==IfNotOmitAV(pB
33430 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 29  t->bDoTruncate))
33440 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ? PAGER_GET_NOCO
33450 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20 72 63  NTENT:0;..    rc
33460 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
33470 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
33480 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33490 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
334a0 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61  rc;.    pBt->nPa
334b0 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 42  ge++;.    if( pB
334c0 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
334d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
334e0 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b   ) pBt->nPage++;
334f0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
33500 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
33510 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
33520 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d  toVacuum && PTRM
33530 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
33540 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a 20 20  Bt->nPage) ){.  
33550 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f      /* If *pPgno
33560 20 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69   refers to a poi
33570 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61  nter-map page, a
33580 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20  llocate two new 
33590 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61  pages.      ** a
335a0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
335b0 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
335c0 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20   one. The first 
335d0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20  allocated page. 
335e0 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20       ** becomes 
335f0 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61  a new pointer-ma
33600 70 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f  p page, the seco
33610 6e 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68  nd is used by th
33620 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20  e caller..      
33630 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
33640 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 20   *pPg = 0;.     
33650 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
33660 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
33670 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
33680 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 70 42  map page)\n", pB
33690 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20 20 20  t->nPage));.    
336a0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
336b0 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Page!=PENDING_BY
336c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
336d0 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
336e0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
336f0 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c 20 26  t, pBt->nPage, &
33700 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29  pPg, bNoContent)
33710 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
33720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33730 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33740 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 2d  3PagerWrite(pPg-
33750 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
33760 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
33770 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
33780 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 42 74  rn rc;.      pBt
337a0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  ->nPage++;.     
337b0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
337c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
337d0 47 45 28 70 42 74 29 20 29 7b 20 70 42 74 2d 3e  GE(pBt) ){ pBt->
337e0 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20 20 7d  nPage++; }.    }
337f0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75 74 34  .#endif.    put4
33800 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a 29 70  byte(28 + (u8*)p
33810 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
33820 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  a, pBt->nPage);.
33830 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74      *pPgno = pBt
33840 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20 61 73  ->nPage;..    as
33850 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
33860 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
33870 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
33880 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
33890 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
338a0 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f 6e 74   ppPage, bNoCont
338b0 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ent);.    if( rc
338c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
338d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
338e0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
338f0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
33900 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
33910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
33920 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
33930 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  );.      *ppPage
33940 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
33950 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
33960 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
33970 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f   file\n", *pPgno
33980 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ));.  }..  asser
33990 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49  t( *pPgno!=PENDI
339a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
339b0 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61  ) );..end_alloca
339c0 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61  te_page:.  relea
339d0 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a  sePage(pTrunk);.
339e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
339f0 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61 73 73  revTrunk);.  ass
33a00 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
33a10 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  OK || sqlite3Pag
33a20 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 28  erPageRefcount((
33a30 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67  *ppPage)->pDbPag
33a40 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  e)<=1 );.  asser
33a50 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
33a60 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69   || (*ppPage)->i
33a70 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 65  sInit==0 );.  re
33a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33a90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
33aa0 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
33ab0 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
33ac0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
33ad0 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
33ae0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
33af0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
33b00 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
33b10 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
33b20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
33b30 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
33b40 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
33b50 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
33b60 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
33b70 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
33b80 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
33b90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
33ba0 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
33bb0 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
33bc0 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
33bd0 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
33be0 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
33bf0 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
33c00 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
33c10 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
33c20 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
33c30 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
33c40 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
33c50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
33c60 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
33c70 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
33c80 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
33c90 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
33ca0 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
33cb0 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
33cc0 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
33cd0 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
33ce0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
33cf0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
33d00 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
33d10 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
33d20 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
33d30 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
33d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
33d50 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
33d60 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
33d70 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
33d80 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
33d90 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
33da0 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
33db0 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
33dc0 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
33dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33de0 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
33df0 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
33e00 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
33e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
33e30 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
33e40 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
33e70 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
33e80 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
33e90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33ea0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
33eb0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
33ec0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
33ed0 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b 0a 20   || iPage>1 );. 
33ee0 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d 50 61   assert( !pMemPa
33ef0 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65 2d 3e  ge || pMemPage->
33f00 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b 0a 0a  pgno==iPage );..
33f10 20 20 69 66 28 20 69 50 61 67 65 3c 32 20 29 20    if( iPage<2 ) 
33f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
33f30 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 69 66  RRUPT_BKPT;.  if
33f40 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
33f50 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
33f60 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
33f70 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
33f80 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
33f90 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
33fa0 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
33fb0 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
33fc0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
33fd0 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
33fe0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
33ff0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34000 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
34010 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
34020 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
34030 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
34040 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
34050 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
34060 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
34070 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
34080 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
34090 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
340a0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
340b0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  TE ){.    /* If 
340c0 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
340d0 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
340e0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
340f0 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
34100 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
34110 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
34120 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
34130 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
34140 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
34150 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
34160 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
34170 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
34180 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
34190 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
341a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
341b0 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
341c0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
341d0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
341e0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
341f0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
34200 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
34210 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
34220 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
34230 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
34240 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
34250 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
34260 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
34270 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
34280 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
34290 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
342a0 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
342b0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
342c0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
342d0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
342e0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
342f0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
34300 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
34310 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
34320 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
34330 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
34340 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
34350 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
34360 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
34370 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
34380 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
34390 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
343a0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
343b0 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
343c0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
343d0 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
343e0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
343f0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
34400 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
34410 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
34420 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
34430 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
34440 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
34450 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
34460 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
34470 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
34480 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
34490 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
344a0 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
344b0 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
344c0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
344d0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
344e0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
344f0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
34500 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
34510 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
34520 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
34530 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
34540 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
34550 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
34560 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34580 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34590 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
345a0 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
345b0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
345c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
345d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
345e0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
345f0 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
34600 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
34610 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34620 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34630 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
34640 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
34650 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
34660 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
34670 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
34680 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
34690 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
346a0 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
346b0 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
346c0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
346d0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
346e0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
346f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
34700 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
34710 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
34720 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
34730 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
34740 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
34750 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
34760 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
34770 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
34780 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
34790 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
347a0 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
347b0 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
347c0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
347d0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
347e0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
347f0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34800 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
34810 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
34820 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34830 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
34840 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
34850 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
34860 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
34870 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
34880 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
34890 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
348a0 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
348b0 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
348c0 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
348d0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
348e0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
348f0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
34900 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
34910 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
34920 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
34930 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
34940 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
34950 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
34960 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
34970 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
34980 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
34990 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
349a0 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
349b0 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
349c0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
349d0 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
349e0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
349f0 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
34a00 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
34a10 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
34a20 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
34a30 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
34a40 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
34a50 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
34a60 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
34a70 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
34a80 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
34a90 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
34aa0 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
34ab0 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
34ac0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
34ad0 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
34ae0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
34af0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
34b00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
34b10 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
34b20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
34b30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34b40 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
34b50 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
34b60 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
34b70 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
34b80 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
34b90 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
34ba0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34bb0 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
34bc0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
34bd0 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
34be0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
34bf0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
34c00 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
34c10 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
34c20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
34c30 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
34c40 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
34c50 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
34c60 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
34c70 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
34c80 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
34c90 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
34ca0 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
34cb0 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
34cc0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
34cd0 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
34ce0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
34cf0 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
34d00 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
34d10 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
34d20 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
34d30 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
34d40 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
34d50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
34d60 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
34d70 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
34d80 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
34d90 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
34da0 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
34db0 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
34dc0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
34dd0 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
34de0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
34df0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
34e00 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
34e10 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
34e20 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
34e30 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
34e40 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
34e50 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
34e60 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
34e70 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
34e80 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
34e90 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
34ea0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
34eb0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34ec0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
34ed0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
34ee0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34ef0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
34f00 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
34f10 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
34f20 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
34f30 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
34f40 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34f50 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
34f60 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
34f70 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
34f80 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
34f90 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
34fa0 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
34fb0 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
34fc0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
34fd0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
34fe0 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
34ff0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
35000 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
35010 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
35020 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
35030 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
35040 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
35050 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
35060 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35070 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
35080 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
35090 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
350a0 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
350b0 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
350c0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
350d0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
350e0 65 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a  en Cell.  Store.
350f0 2a 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74  ** size informat
35100 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65  ion about the ce
35110 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a  ll in pInfo..*/.
35120 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
35130 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35140 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
35150 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
35160 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
35170 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
35180 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
35190 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
351a0 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
351b0 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
351c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
351d0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
351e0 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  out the cell */.
351f0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
35200 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  Bt;.  Pgno ovflP
35210 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
35220 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
35230 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
35240 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35250 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
35260 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35270 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
35280 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35290 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
352a0 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  if( pInfo->nLoca
352b0 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  l==pInfo->nPaylo
352c0 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
352d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
352e0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
352f0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
35300 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
35310 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   */.  }.  testca
35320 73 65 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66  se( pCell + pInf
35330 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20 70 50 61 67  o->nSize == pPag
35340 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
35350 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
35360 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65   + (pInfo->nSize
35370 2d 31 29 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44  -1) == pPage->aD
35380 61 74 61 45 6e 64 20 29 3b 0a 20 20 69 66 28 20  ataEnd );.  if( 
35390 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
353a0 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
353b0 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 2f 2a  ataEnd ){.    /*
353c0 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61   Cell extends pa
353d0 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a  st end of page *
353e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
353f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
35400 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f  (pPage);.  }.  o
35410 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
35420 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f  te(pCell + pInfo
35430 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  ->nSize - 4);.  
35440 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
35450 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
35460 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
35470 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
35480 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
35490 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
354a0 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   = (pInfo->nPayl
354b0 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  oad - pInfo->nLo
354c0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
354d0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
354e0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
354f0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
35500 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
35510 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
35520 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
35530 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
35540 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
35550 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
35560 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
35570 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
35580 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
35590 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
355a0 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
355b0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
355c0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
355d0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
355e0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
355f0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
35600 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
35610 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
35620 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
35630 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
35640 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
35650 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
35660 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
35670 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35680 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35690 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
356a0 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
356b0 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
356c0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
356d0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
356e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
356f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
35700 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
35710 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
35720 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
35730 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
35740 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
35750 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
35760 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
35770 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
35780 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
35790 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
357a0 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
357b0 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
357c0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
357d0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
357e0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
357f0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
35800 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
35810 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
35820 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
35830 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
35840 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
35850 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
35860 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
35870 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
35880 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
35890 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
358a0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
358b0 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
358c0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
358d0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
358e0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
358f0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
35900 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
35910 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
35920 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
35930 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
35940 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
35950 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
35960 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
35970 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
35980 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
35990 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
359a0 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
359b0 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
359c0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
359d0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
359e0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
359f0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
35a00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
35a10 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
35a20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
35a30 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
35a40 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
35a50 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
35a60 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
35a70 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
35a80 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
35a90 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
35aa0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
35ab0 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
35ac0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
35ad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35ae0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
35af0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
35b00 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
35b10 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
35b20 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
35b30 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
35b40 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
35b50 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
35b60 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
35b70 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
35b80 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
35b90 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
35ba0 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
35bb0 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
35bc0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
35bd0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
35be0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
35bf0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
35c00 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
35c10 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
35c20 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
35c30 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
35c40 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
35c50 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
35c60 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
35c70 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
35c80 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
35c90 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
35ca0 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
35cb0 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
35cc0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
35cd0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
35ce0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
35cf0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
35d00 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
35d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
35d20 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
35d30 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
35d40 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
35d50 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
35d60 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
35d70 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
35d80 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74  ll */.  const Bt
35d90 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20  reePayload *pX, 
35da0 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61         /* Payloa
35db0 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20  d with which to 
35dc0 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65  construct the ce
35dd0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ll */.  int *pnS
35de0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
35df0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
35e00 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
35e10 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
35e20 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
35e30 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
35e40 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20  c, n, rc, mn;.  
35e50 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
35e60 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
35e70 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ease;.  unsigned
35e80 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
35e90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35ea0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
35eb0 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
35ec0 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e  o pgnoOvfl;.  in
35ed0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
35ee0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
35ef0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
35f00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
35f10 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
35f20 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
35f30 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
35f40 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
35f50 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
35f60 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
35f70 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
35f80 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
35f90 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
35fa0 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
35fb0 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
35fc0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
35fd0 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
35fe0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
35ff0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
36000 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
36010 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
36020 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
36030 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
36040 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
36050 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28  ldPtrSize;.  if(
36060 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36070 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
36080 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d   pX->nData + pX-
36090 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63  >nZero;.    pSrc
360a0 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20   = pX->pData;.  
360b0 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61    nSrc = pX->nDa
360c0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
360d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
360e0 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65  f ); /* fillInCe
360f0 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ll() only called
36100 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20   for leaves */. 
36110 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
36120 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
36130 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
36140 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65  oad);.    nHeade
36150 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
36160 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36170 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79  *(u64*)&pX->nKey
36180 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36190 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79  assert( pX->nKey
361a0 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20  <=0x7fffffff && 
361b0 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20  pX->pKey!=0 );. 
361c0 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f     nSrc = nPaylo
361d0 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b  ad = (int)pX->nK
361e0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
361f0 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65  X->pKey;.    nHe
36200 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
36210 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
36220 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
36230 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c    }.  .  /* Fill
36240 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
36250 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  */.  pPayload = 
36260 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
36270 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
36280 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
36290 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
362a0 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
362b0 73 65 20 77 68 65 72 65 20 65 76 65 72 79 74 68  se where everyth
362c0 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68 65 20  ing fits on the 
362d0 62 74 72 65 65 20 70 61 67 65 0a 20 20 20 20 2a  btree page.    *
362e0 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f  * and no overflo
362f0 77 20 70 61 67 65 73 20 61 72 65 20 72 65 71 75  w pages are requ
36300 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d  ired. */.    n =
36310 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
36320 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
36330 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
36340 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
36350 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
36360 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
36370 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65 72  e = n;.    asser
36380 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61  t( nSrc<=nPayloa
36390 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
363a0 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64  e( nSrc<nPayload
363b0 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   );.    memcpy(p
363c0 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
363d0 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Src);.    memset
363e0 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20  (pPayload+nSrc, 
363f0 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63  0, nPayload-nSrc
36400 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
36410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
36420 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
36430 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
36440 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 6f 66  ans that some of
36450 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c   the content wil
36460 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73  l need.  ** to s
36470 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  pill onto overfl
36480 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ow pages..  */. 
36490 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
364a0 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20  Local;.  n = mn 
364b0 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
364c0 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
364d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
364e0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
364f0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
36500 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
36510 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
36520 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 20  al+1 );.  if( n 
36530 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
36540 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70  l ) n = mn;.  sp
36550 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a  aceLeft = n;.  *
36560 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
36570 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50 72 69  ader + 4;.  pPri
36580 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
36590 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c  der+n];.  pToRel
365a0 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f  ease = 0;.  pgno
365b0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20  Ovfl = 0;.  pBt 
365c0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
365d0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
365e0 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
365f0 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
36600 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
36610 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
36620 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
36630 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
36640 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
36650 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
36660 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
36670 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
36680 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
36690 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
366a0 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
366b0 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
366c0 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
366e0 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
366f0 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
36700 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
36710 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
36720 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
36730 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
36740 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
36750 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
36760 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
36770 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
36780 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
36790 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
367a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
367b0 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
367c0 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
367d0 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
367e0 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
367f0 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
36800 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
36810 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
36820 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
36830 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
36840 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67  o info;.    pPag
36850 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
36860 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
36870 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
36880 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69  nHeader==(int)(i
36890 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
368a0 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73  Cell) );.    ass
368b0 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
368c0 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  pX->nKey );.    
368d0 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
368e0 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
368f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
36900 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
36910 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  Local );.  }.#en
36920 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
36930 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
36940 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
36950 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
36960 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
36970 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  s */.  while( 1 
36980 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c  ){.    n = nPayl
36990 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
369a0 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
369b0 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
369c0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
369d0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
369e0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
369f0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
36a00 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
36a10 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
36a20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
36a30 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
36a40 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
36a50 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
36a60 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
36a70 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
36a80 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
36a90 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
36aa0 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
36ab0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
36ac0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
36ad0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
36ae0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
36af0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
36b00 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
36b10 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
36b20 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
36b30 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
36b40 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
36b50 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
36b60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36b70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
36b80 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
36b90 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  >=n ){.      mem
36ba0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
36bb0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
36bc0 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a  e if( nSrc>0 ){.
36bd0 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a        n = nSrc;.
36be0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
36bf0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
36c00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36c10 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
36c20 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
36c30 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
36c40 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 79 6c  n;.    if( nPayl
36c50 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oad<=0 ) break;.
36c60 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
36c70 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
36c80 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
36c90 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
36ca0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73 70 61  = n;.    if( spa
36cb0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20  ceLeft==0 ){.   
36cc0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
36cd0 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
36ce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
36cf0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
36d00 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
36d10 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
36d20 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
36d30 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
36d40 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
36d50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
36d60 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
36d70 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
36d80 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
36d90 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
36da0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
36db0 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
36dc0 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
36dd0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
36de0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
36df0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
36e00 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
36e10 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
36e20 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
36e30 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
36e40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36e50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
36e60 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
36e70 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
36e80 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
36e90 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
36ea0 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
36eb0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
36ec0 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
36ed0 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
36ee0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
36ef0 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
36f00 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
36f10 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
36f20 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
36f30 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
36f40 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
36f50 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
36f60 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
36f70 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
36f80 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
36f90 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
36fa0 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
36fb0 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
36fc0 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
36fd0 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
36fe0 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
36ff0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
37000 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
37010 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
37020 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
37030 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
37040 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
37050 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
37060 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
37070 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
37080 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
37090 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
370a0 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
370b0 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
370c0 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
370d0 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
370e0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
370f0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
37100 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
37110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
37120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
37130 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
37140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37150 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
37160 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37170 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
37180 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
37190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
371a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
371b0 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
371c0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
371d0 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
371e0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
371f0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
37200 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
37210 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
37220 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37230 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
37240 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
37250 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37260 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
37270 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
37280 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
37290 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
372a0 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
372b0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
372c0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
372d0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
372e0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
372f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
37300 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
37310 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
37320 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37330 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
37340 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
37350 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37360 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37370 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
37380 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
37390 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
373a0 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
373b0 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
373c0 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
373d0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
373e0 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
373f0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
37400 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
37410 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
37420 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
37430 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
37440 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
37450 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
37460 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
37470 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
37480 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
37490 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
374a0 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
374b0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
374c0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
374d0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
374e0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
374f0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
37500 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
37510 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
37520 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
37530 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
37540 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
37550 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
37560 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
37570 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
37580 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
37590 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
375a0 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
375b0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
375c0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
375d0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
375e0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
375f0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
37600 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
37610 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
37620 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
37630 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
37640 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
37650 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
37660 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
37670 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
37680 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
37690 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
376a0 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
376b0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
376c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
376d0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
376e0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
376f0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
37700 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
37710 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
37720 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
37730 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
37740 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
37750 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
37760 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
37770 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
37780 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
37790 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
377a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
377b0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
377c0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
377d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
377e0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
377f0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
37800 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
37810 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
37820 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
37830 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
37840 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
37850 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
37860 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
37870 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
37880 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
37890 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
378a0 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
378b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
378c0 3b 0a 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20  ;.  if( pc+sz > 
378d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
378e0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
378f0 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
37900 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
37910 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
37920 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
37930 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
37940 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
37950 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
37960 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
37970 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
37980 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
37990 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
379a0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
379b0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
379c0 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
379d0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
379e0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
379f0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
37a00 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
37a10 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
37a20 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
37a30 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
37a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
37a50 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
37a60 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
37a70 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
37a80 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
37a90 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
37aa0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
37ab0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
37ac0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
37ad0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
37ae0 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
37af0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
37b00 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
37b10 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
37b20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
37b30 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
37b40 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
37b50 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
37b60 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
37b70 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
37b80 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
37b90 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
37ba0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
37bb0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
37bc0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
37bd0 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
37be0 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
37bf0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
37c00 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
37c10 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
37c20 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d   pPage->apOvfl[]
37c30 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69   and make it poi
37c40 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  nt to the cell c
37c50 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a  ontent (either.*
37c60 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68  * in pTemp or th
37c70 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c  e original pCell
37c80 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72  ) and also recor
37c90 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a  d its index. .**
37ca0 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   Allocating a ne
37cb0 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65  w entry in pPage
37cc0 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65  ->aCell[] implie
37cd0 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65  s that .** pPage
37ce0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69  ->nOverflow is i
37cf0 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a  ncremented..**.*
37d00 2a 20 2a 70 52 43 20 6d 75 73 74 20 62 65 20 53  * *pRC must be S
37d10 51 4c 49 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68  QLITE_OK when th
37d20 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
37d30 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
37d40 76 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28  void insertCell(
37d50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
37d60 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
37d70 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
37d80 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
37d90 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
37da0 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
37db0 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
37dc0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
37dd0 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
37de0 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
37df0 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
37e00 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
37e10 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
37e20 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
37e30 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
37e40 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
37e50 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
37e60 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
37e70 64 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ded */.  Pgno iC
37e80 68 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66  hild,      /* If
37e90 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61   non-zero, repla
37ea0 63 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  ce first 4 bytes
37eb0 20 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65   with this value
37ec0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20   */.  int *pRC  
37ed0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
37ee0 61 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e  and write return
37ef0 20 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20   code from here 
37f00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20  */.){.  int idx 
37f10 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65  = 0;      /* Whe
37f20 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20  re to write new 
37f30 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20  cell content in 
37f40 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
37f50 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
37f60 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
37f70 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
37f80 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74       /* The cont
37f90 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65  ent of the whole
37fa0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
37fb0 49 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Ins;         /* 
37fc0 54 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61  The point in pPa
37fd0 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77  ge->aCellIdx[] w
37fe0 68 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73  here no cell ins
37ff0 65 72 74 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65  erted */..  asse
38000 72 74 28 20 2a 70 52 43 3d 3d 53 51 4c 49 54 45  rt( *pRC==SQLITE
38010 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
38020 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61 67   i>=0 && i<=pPag
38030 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d 3e  e->nCell+pPage->
38040 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20 61  nOverflow );.  a
38050 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28 70  ssert( MX_CELL(p
38060 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39 32  Page->pBt)<=1092
38070 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
38080 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f  Page->nCell<=MX_
38090 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
380a0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
380b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
380c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
380d0 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
380e0 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  pOvfl) );.  asse
380f0 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70 50  rt( ArraySize(pP
38100 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41 72  age->apOvfl)==Ar
38110 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
38120 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65  iOvfl) );.  asse
38130 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
38140 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
38150 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
38160 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75 6c  * The cell shoul
38170 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73 69  d normally be si
38180 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  zed correctly.  
38190 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d 6f  However, when mo
381a0 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c 66  ving a.  ** malf
381b0 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d 20  ormed cell from 
381c0 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 61  a leaf page to a
381d0 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 2c  n interior page,
381e0 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69 7a   if the cell siz
381f0 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74 6f  e.  ** wanted to
38200 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 20   be less than 4 
38210 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64 20  but got rounded 
38220 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20 6c  up to 4 on the l
38230 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a 20  eaf, then size. 
38240 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65 73   ** might be les
38250 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d 73  s than 8 (leaf-s
38260 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20 6f  ize + pointer) o
38270 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e  n the interior n
38280 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a 2a  ode.  Hence.  **
38290 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72 20   the term after 
382a0 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66 6f  the || in the fo
382b0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29  llowing assert()
382c0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  . */.  assert( s
382d0 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53  z==pPage->xCellS
382e0 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ize(pPage, pCell
382f0 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20 69  ) || (sz==8 && i
38300 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69 66  Child>0) );.  if
38310 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
38320 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
38330 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
38340 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
38350 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20    memcpy(pTemp, 
38360 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
38370 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
38380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
38390 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
383a0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
383b0 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Child);.    }.  
383c0 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76    j = pPage->nOv
383d0 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 2f 2a  erflow++;.    /*
383e0 20 43 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   Comparison agai
383f0 6e 73 74 20 41 72 72 61 79 53 69 7a 65 2d 31 20  nst ArraySize-1 
38400 73 69 6e 63 65 20 77 65 20 68 6f 6c 64 20 62 61  since we hold ba
38410 63 6b 20 6f 6e 65 20 65 78 74 72 61 20 73 6c 6f  ck one extra slo
38420 74 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 63 6f  t.    ** as a co
38430 6e 74 69 6e 67 65 6e 63 79 2e 20 20 49 6e 20 6f  ntingency.  In o
38440 74 68 65 72 20 77 6f 72 64 73 2c 20 6e 65 76 65  ther words, neve
38450 72 20 6e 65 65 64 20 6d 6f 72 65 20 74 68 61 6e  r need more than
38460 20 33 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20   3 overflow.    
38470 2a 2a 20 73 6c 6f 74 73 20 62 75 74 20 34 20 61  ** slots but 4 a
38480 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 6a 75  re allocated, ju
38490 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 20 2a  st to be safe. *
384a0 2f 0a 20 20 20 20 61 7