/ Hex Artifact Content
Login

Artifact 2105865a621c211cd76d8d21a6831249c31c876d7d1fe7d7ebe27410cd893747:


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 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
7170: 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
7180: 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
7190: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
71a0: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
71b0: 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
71c0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
71d0: 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65  _FAULT ){.    re
71e0: 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
71f0: 65 78 74 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  ext;.  }.  pCur-
7200: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
7210: 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d  _INVALID;.  rc =
7220: 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75   btreeMoveto(pCu
7230: 72 2c 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70  r, pCur->pKey, p
7240: 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73  Cur->nKey, 0, &s
7250: 6b 69 70 4e 65 78 74 29 3b 0a 20 20 69 66 28 20  kipNext);.  if( 
7260: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7270: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
7280: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
7290: 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20     pCur->pKey = 
72a0: 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
72b0: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
72c0: 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
72d0: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
72e0: 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20  R_INVALID );.   
72f0: 20 69 66 28 20 73 6b 69 70 4e 65 78 74 20 29 20   if( skipNext ) 
7300: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
7310: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69   skipNext;.    i
7320: 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
7330: 74 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  t && pCur->eStat
7340: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
7350: 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
7360: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53  State = CURSOR_S
7370: 4b 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20  KIPNEXT;.    }. 
7380: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7390: 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f  }..#define resto
73a0: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
73b0: 28 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61  (p) \.  (p->eSta
73c0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
73d0: 52 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20  RESEEK ? \.     
73e0: 20 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65      btreeRestore
73f0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7400: 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53  ) : \.         S
7410: 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a  QLITE_OK)../*.**
7420: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
7430: 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73  er or not a curs
7440: 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f  or has moved fro
7450: 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77  m the position w
7460: 68 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c  here.** it was l
7470: 61 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68  ast placed, or h
7480: 61 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61  as been invalida
7490: 74 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65  ted for any othe
74a0: 72 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72  r reason..** Cur
74b0: 73 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68  sors can move wh
74c0: 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20  en the row they 
74d0: 61 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  are pointing at 
74e0: 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a  is deleted out.*
74f0: 2a 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  * from under the
7500: 6d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20  m, for example. 
7510: 20 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c   Cursor might al
7520: 73 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72  so move if a btr
7530: 65 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e  ee.** is rebalan
7540: 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ced..**.** Calli
7550: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
7560: 77 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73  with a NULL curs
7570: 6f 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  or pointer retur
7580: 6e 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20  ns false..**.** 
7590: 55 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65  Use the separate
75a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
75b0: 73 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75  sorRestore() rou
75c0: 74 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20  tine to restore 
75d0: 61 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b  a cursor.** back
75e0: 20 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67   to where it oug
75f0: 68 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73  ht to be if this
7600: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
7610: 20 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   true..*/.int sq
7620: 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
7630: 48 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f  HasMoved(BtCurso
7640: 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
7650: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
7660: 4c 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20  LIGNMENT(pCur). 
7670: 20 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73        || pCur==s
7680: 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56  qlite3BtreeFakeV
7690: 61 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a  alidCursor() );.
76a0: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
76b0: 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74  of(BtCursor, eSt
76c0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ate)==0 );.  ass
76d0: 65 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72  ert( sizeof(pCur
76e0: 2d 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a  ->eState)==1 );.
76f0: 20 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f    return CURSOR_
7700: 56 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70  VALID != *(u8*)p
7710: 43 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Cur;.}../*.** Re
7720: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7730: 6f 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f  o a fake BtCurso
7740: 72 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69  r object that wi
7750: 6c 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72  ll always answer
7760: 0a 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65  .** false to the
7770: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
7780: 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f  sorHasMoved() ro
7790: 75 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68  utine above.  Th
77a0: 65 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72  e fake.** cursor
77b0: 20 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e   returned must n
77c0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
77d0: 61 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20  any other Btree 
77e0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74  interface..*/.Bt
77f0: 43 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42  Cursor *sqlite3B
7800: 74 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72  treeFakeValidCur
7810: 73 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  sor(void){.  sta
7820: 74 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f  tic u8 fakeCurso
7830: 72 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  r = CURSOR_VALID
7840: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
7850: 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65  etof(BtCursor, e
7860: 53 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72  State)==0 );.  r
7870: 65 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a  eturn (BtCursor*
7880: 29 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a  )&fakeCursor;.}.
7890: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
78a0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
78b0: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
78c0: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
78d0: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
78e0: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
78f0: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
7900: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
7910: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
7920: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
7930: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
7940: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
7950: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
7960: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
7970: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
7980: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
7990: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
79a0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
79b0: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
79c0: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
79d0: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
79e0: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
79f0: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7a00: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7a10: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7a20: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7a30: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7a40: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
7a50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7a60: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
7a70: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
7a80: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
7a90: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
7aa0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7ab0: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7ac0: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7ad0: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7ae0: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7af0: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7b00: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7b10: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7b20: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7b30: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7b40: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
7b50: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
7b60: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7b70: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
7b80: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
7b90: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
7ba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7bb0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7bc0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7bd0: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7be0: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7bf0: 65 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  e{.    *pDiffere
7c00: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7c10: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7c20: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c30: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c40: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c50: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c60: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c70: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c80: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c90: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7ca0: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7cb0: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7cc0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7cd0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7ce0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cf0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7d00: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7d10: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7d20: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d30: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d40: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d50: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d60: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d70: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d80: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d90: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7da0: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7db0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7dc0: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7dd0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7de0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7df0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7e00: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7e10: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7e20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e30: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e40: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e50: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e60: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e70: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e80: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e90: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7ea0: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7eb0: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7ec0: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ed0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7ee0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ef0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7f00: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7f10: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7f20: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f30: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f40: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f50: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f60: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f70: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f80: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f90: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7fb0: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7fc0: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fd0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fe0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7ff0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
8000: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
8010: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
8020: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8030: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8040: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8050: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8060: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8070: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8080: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8090: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
80a0: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
80b0: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
80c0: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80d0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80e0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80f0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
8100: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
8110: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
8120: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8140: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8150: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8160: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8170: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8180: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8190: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
81a0: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
81b0: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
81c0: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81d0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81e0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81f0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
8200: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
8210: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
8220: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8230: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8240: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8250: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8260: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8270: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8280: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8290: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
82a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
82b0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
82c0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82d0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82e0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82f0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
8300: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
8310: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
8320: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8330: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8340: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8350: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8360: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8370: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8380: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8390: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
83a0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
83b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
83c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83d0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83e0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83f0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
8400: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
8410: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8420: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8430: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8440: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8450: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8460: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8470: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8480: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8490: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
84a0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
84b0: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
84c0: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84d0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84e0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84f0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
8500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
8510: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
8520: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8530: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8540: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8550: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8560: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8570: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8580: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8590: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
85a0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
85b0: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
85c0: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85d0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85e0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85f0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
8600: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
8610: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
8620: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8630: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8640: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8650: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8660: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8670: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8680: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8690: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
86a0: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
86b0: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
86c0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86d0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86e0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86f0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
8700: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
8710: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
8720: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8730: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8740: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8750: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8760: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8770: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8780: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8790: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
87a0: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
87b0: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
87c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87d0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87e0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87f0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
8800: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
8810: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
8820: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8830: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8840: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8860: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8870: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8880: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8890: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
88a0: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
88b0: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
88c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88d0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88e0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88f0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
8900: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8910: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8920: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8930: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8940: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8950: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8960: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8970: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8980: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8990: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
89a0: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
89b0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
89c0: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89d0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89e0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
8a00: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
8a10: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
8a20: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a30: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a40: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a50: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a60: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a70: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a80: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a90: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8aa0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8ab0: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8ac0: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8ad0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8af0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8b00: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8b10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8b20: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b40: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b50: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b60: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b70: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b80: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b90: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8ba0: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8bc0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8bd0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8be0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bf0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8c00: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8c10: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8c20: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c30: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c40: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c70: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c80: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c90: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8ca0: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8cb0: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8cc0: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8cd0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8ce0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cf0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8d00: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8d10: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8d20: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d30: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d40: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d60: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d90: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8da0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8db0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8dc0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8dd0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8de0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8df0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8e00: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8e10: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e30: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e40: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e50: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e60: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e70: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e80: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e90: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8ea0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8eb0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8ec0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ed0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8ee0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ef0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8f00: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8f10: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8f20: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f30: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f40: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f70: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f80: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f90: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8fa0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8fb0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8fc0: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fd0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fe0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8ff0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
9000: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
9010: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
9020: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9030: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9040: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9050: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9060: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9070: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9080: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9090: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
90a0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
90b0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
90c0: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90d0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90e0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90f0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
9100: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
9110: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
9120: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9130: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9140: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9150: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9160: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9170: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9180: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9190: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
91a0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
91b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
91c0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91d0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
9200: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
9210: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
9220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9230: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9240: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9250: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9260: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9270: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9280: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9290: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
92a0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
92b0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
92c0: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92d0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92e0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92f0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
9300: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
9310: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
9320: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9330: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9340: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9350: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9360: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9370: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9380: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9390: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
93a0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
93b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
93c0: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93d0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93e0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93f0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
9400: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
9410: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
9420: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9430: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9440: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9450: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9460: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9470: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9480: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9490: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
94a0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
94b0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
94c0: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94d0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94e0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94f0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
9500: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
9510: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
9520: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9530: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9540: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9550: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9560: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9570: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9580: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9590: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
95a0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
95b0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
95c0: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95d0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95f0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
9600: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
9610: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
9620: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9630: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9640: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9650: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9660: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9670: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9680: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9690: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
96a0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
96b0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
96c0: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96d0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96e0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96f0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
9700: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
9710: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
9720: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9730: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9740: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9750: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9760: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9770: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9780: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9790: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
97a0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
97b0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
97c0: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97d0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97e0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97f0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
9800: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
9810: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
9820: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9830: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9840: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9850: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9860: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9870: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9880: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9890: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
98a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
98c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9900: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9910: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
9920: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9930: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9940: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9950: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9960: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9970: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9980: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9990: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
99a0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
99b0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
99c0: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99d0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99e0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9a00: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9a10: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
9a20: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a30: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a50: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a60: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a70: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a90: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9aa0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9ab0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9ac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9ad0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ae0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9af0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9b00: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9b10: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9b20: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b30: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b40: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b50: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b60: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b80: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b90: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9ba0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9bb0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9bc0: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9bd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9be0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bf0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9c00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9c10: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9c20: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c30: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c40: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c60: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c70: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c80: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c90: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9ca0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9cb0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9cc0: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9cd0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9ce0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cf0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9d00: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9d10: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9d20: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d30: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d40: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d50: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d60: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d70: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d80: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d90: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9da0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9db0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9dc0: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9dd0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9de0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9df0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9e00: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9e10: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9e20: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e30: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e40: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e50: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e60: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e70: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e80: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e90: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9ea0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9eb0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9ec0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ed0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9ee0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ef0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9f00: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9f10: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9f20: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f30: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f40: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f50: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f60: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f70: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f80: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9fa0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9fb0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9fc0: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fd0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fe0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9ff0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a000: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a010: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a020: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a030: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a040: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a050: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a060: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a070: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a080: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a090: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a0a0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a0b0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a0c0: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0d0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0e0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0f0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a100: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a110: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a120: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a130: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a140: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a150: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a160: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a170: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a180: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a190: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a1a0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a1b0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a1c0: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1d0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1f0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a200: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a210: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a220: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a230: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a240: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a250: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a260: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a270: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a280: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a290: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a2a0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a2c0: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2d0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2e0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a300: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a310: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a320: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a330: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a340: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a350: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a360: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a370: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a380: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a390: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a3a0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a3b0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a3c0: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3d0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3e0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3f0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a400: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a410: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a420: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a430: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a440: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a450: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a460: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a470: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a480: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a490: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a4a0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a4b0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a4c0: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4d0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4e0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4f0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a500: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a520: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a530: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a540: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a550: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a560: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a570: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a580: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a590: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a5a0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a5b0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a5c0: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5d0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5e0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5f0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a600: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a610: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a620: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a630: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a640: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a650: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a660: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a670: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a680: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a690: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a6a0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a6b0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a6c0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6d0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6e0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6f0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a700: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a710: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a720: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a730: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a740: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a750: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a760: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a770: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a780: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a790: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a7a0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a7b0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a7c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7d0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7e0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7f0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a800: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a810: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a820: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a830: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a840: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a850: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a860: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a870: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a880: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a890: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a8a0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a8b0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a8c0: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8d0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8e0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8f0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a900: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a910: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a920: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a930: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a940: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a950: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a960: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a970: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a980: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a990: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a9a0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a9b0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a9c0: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9d0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9e0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9f0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
aa00: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
aa10: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa40: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa50: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa60: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa90: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aaa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aab0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aac0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aad0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aae0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aaf0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
ab00: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
ab10: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
ab20: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab30: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab40: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab50: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab60: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab70: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab80: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab90: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
aba0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
abb0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
abc0: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
abd0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abe0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abf0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
ac00: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
ac10: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
ac20: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac30: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac40: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac50: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac60: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac70: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac80: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac90: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
aca0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
acb0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
acc0: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
acd0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
ace0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acf0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
ad00: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ad10: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
ad20: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad30: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad40: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad50: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad60: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad70: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad80: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad90: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ada0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
adb0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
adc0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
add0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
ade0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adf0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
ae00: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ae10: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
ae20: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae30: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae40: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae60: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae70: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae80: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae90: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
aea0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
aeb0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
aec0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aed0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aee0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aef0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
af00: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
af10: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
af20: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af30: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af40: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af50: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af60: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af70: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af80: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af90: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
afa0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
afb0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
afc0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afd0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afe0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
aff0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
b000: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
b010: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
b020: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b030: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b040: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b050: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b060: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b070: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b080: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b090: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b0a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b0b0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b0c0: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0e0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0f0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b100: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b110: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b120: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b130: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b140: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b150: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b160: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b170: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b180: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b190: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b1a0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b1b0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b1c0: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1d0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1e0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1f0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b200: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b210: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b220: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b230: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b240: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b250: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b260: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b270: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b280: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b290: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b2a0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b2b0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b2c0: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2d0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2e0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2f0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b300: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b310: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b320: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b330: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b340: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b350: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b360: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b370: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b380: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b390: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b3a0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b3b0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b3c0: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3d0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3e0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3f0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b400: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b410: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b420: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b430: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b440: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b450: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b460: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b470: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b480: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b490: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b4a0: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b4b0: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b4c0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4d0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4f0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b500: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b510: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b520: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b530: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b540: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b550: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b560: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b570: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b580: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b590: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b5a0: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b5b0: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b5c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5d0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5e0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5f0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b600: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b610: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b620: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b630: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b640: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b650: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b660: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b670: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b680: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b690: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b6a0: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6d0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6e0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6f0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b700: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b710: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b720: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b730: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b740: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b750: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b760: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b770: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b780: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b790: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b7a0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b7b0: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b7c0: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7d0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7e0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7f0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b800: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b810: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b820: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b830: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b840: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b850: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b860: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b870: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b880: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b890: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b8a0: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b8b0: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b8c0: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8d0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8e0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8f0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b900: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b910: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b920: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b930: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b940: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b950: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b960: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b970: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b980: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b990: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b9a0: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b9c0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9d0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9e0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9f0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
ba00: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
ba10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba40: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba50: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba70: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba80: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba90: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
baa0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
bab0: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
bac0: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
bad0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bae0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
baf0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bb00: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bb10: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
bb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb30: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb40: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb50: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb70: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb80: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bba0: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bbb0: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bbc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bbd0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbe0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbf0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bc00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bc10: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bc20: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc30: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc40: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc50: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc60: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc70: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc90: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bca0: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bcb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bcc0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bcd0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcf0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bd00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bd10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bd20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd30: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd40: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd50: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd70: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd90: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bda0: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bdb0: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bdc0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bdd0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bde0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdf0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
be00: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
be10: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
be20: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be30: 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ) );.  iCellFirs
be40: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
be50: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62   2*nCell;.  usab
be60: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
be70: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be80: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
be90: 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20  k handles pages 
bea0: 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65  with two or fewe
beb0: 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e  r free blocks an
bec0: 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20  d nMaxFrag.  ** 
bed0: 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e  or fewer fragmen
bee0: 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68  ted bytes. In th
bef0: 69 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61  is case it is fa
bf00: 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65  ster to move the
bf10: 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e  .  ** two (or on
bf20: 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c  e) blocks of cel
bf30: 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65  ls using memmove
bf40: 28 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  () and add the r
bf50: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66  equired.  ** off
bf60: 73 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69  sets to each poi
bf70: 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c  nter in the cell
bf80: 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74  -pointer array t
bf90: 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20  han it is to .  
bfa0: 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74  ** reconstruct t
bfb0: 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20  he entire page. 
bfc0: 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64   */.  if( (int)d
bfd0: 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78  ata[hdr+7]<=nMax
bfe0: 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Frag ){.    int 
bff0: 69 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65  iFree = get2byte
c000: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
c010: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
c020: 6e 69 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b  nitial freeblock
c030: 20 6f 66 66 73 65 74 20 77 65 72 65 20 6f 75 74   offset were out
c040: 20 6f 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74   of bounds, that
c050: 20 77 6f 75 6c 64 20 68 61 76 65 0a 20 20 20 20   would have.    
c060: 2a 2a 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ** been detected
c070: 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65   by btreeCompute
c080: 46 72 65 65 53 70 61 63 65 28 29 20 77 68 65 6e  FreeSpace() when
c090: 20 69 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e   it was computin
c0a0: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  g the.    ** num
c0b0: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
c0c0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
c0d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  /.    assert( iF
c0e0: 72 65 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d  ree<=usableSize-
c0f0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  4 );.    if( iFr
c100: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
c110: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
c120: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
c130: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
c140: 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  2>usableSize-4 )
c150: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c160: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c170: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  e);.      if( 0=
c180: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
c190: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
c1a0: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
c1b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
c1c0: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
c1d0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
c1e0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
c1f0: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
c200: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
c210: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
c220: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
c230: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
c240: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
c250: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c260: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
c270: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
c280: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c290: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c2a0: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
c2b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
c2c0: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
c2d0: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
c2e0: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
c2f0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c300: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c310: 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32        sz2 = get2
c320: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c330: 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  2+2]);.         
c340: 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20   if( iFree2+sz2 
c350: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  > usableSize ) r
c360: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c370: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c380: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
c390: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
c3a0: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
c3b0: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
c3c0: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
c3d0: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
c3e0: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
c3f0: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
c400: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
c410: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
c420: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
c430: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
c440: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
c450: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
c460: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
c470: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
c480: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
c490: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
c4a0: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
c4b0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
c4c0: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
c4d0: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
c4e0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c4f0: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
c500: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
c510: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
c520: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
c530: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
c540: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
c550: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
c560: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c570: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c580: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
c590: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
c5a0: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
c5b0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
c5c0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
c5d0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
c5e0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c5f0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
c600: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
c610: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c620: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
c630: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c640: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
c650: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c660: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
c670: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
c680: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
c690: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
c6a0: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
c6b0: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
c6c0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
c6d0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
c6e0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c6f0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c700: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
c710: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c720: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c730: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
c740: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
c750: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
c760: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
c770: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
c780: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
c790: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
c7a0: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
c7b0: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c7c0: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
c7d0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c7e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c7f0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c800: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
c810: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
c820: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
c830: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
c840: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
c850: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c860: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c870: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
c880: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
c890: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
c8a0: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
c8b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c8c0: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
c8d0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
c8e0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
c8f0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
c900: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
c910: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
c920: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
c930: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
c940: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
c950: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
c960: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
c970: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
c980: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
c990: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
c9a0: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
c9b0: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
c9c0: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
c9d0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 61 73 73 65 72  ent_out:.  asser
c9e0: 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  t( pPage->nFree>
c9f0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 64 61 74 61  =0 );.  if( data
ca00: 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d 69 43 65  [hdr+7]+cbrk-iCe
ca10: 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d 3e  llFirst!=pPage->
ca20: 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65 74  nFree ){.    ret
ca30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ca40: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ca50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62    }.  assert( cb
ca60: 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29  rk>=iCellFirst )
ca70: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
ca80: 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29  ta[hdr+5], cbrk)
ca90: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20  ;.  data[hdr+1] 
caa0: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
cab0: 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  2] = 0;.  memset
cac0: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
cad0: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
cae0: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
caf0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
cb00: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
cb10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
cb20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
cb30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
cb40: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
cb50: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
cb60: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
cb70: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
cb80: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
cb90: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
cba0: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
cbb0: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
cbc0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
cbd0: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
cbe0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
cbf0: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
cc00: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
cc10: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
cc20: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
cc30: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cc40: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
cc50: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
cc60: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
cc70: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
cc80: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
cc90: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
cca0: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
ccb0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
ccc0: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
ccd0: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
cce0: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
ccf0: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
cd00: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
cd10: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
cd20: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
cd30: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
cd40: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
cd50: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
cd60: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
cd70: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
cd80: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
cd90: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
cda0: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
cdb0: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
cdc0: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
cdd0: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
cdf0: 66 66 73 65 74 20 74 6f 20 70 61 67 65 20 68 65  ffset to page he
ce00: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 20 63  ader */.  u8 * c
ce10: 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
ce20: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20 20  ->aData;        
ce30: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61 74       /* Page dat
ce40: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72  a */.  int iAddr
ce50: 20 3d 20 68 64 72 20 2b 20 31 3b 20 20 20 20 20   = hdr + 1;     
ce60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce70: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ce80: 70 74 72 20 74 6f 20 70 63 20 2a 2f 0a 20 20 69  ptr to pc */.  i
ce90: 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65  nt pc = get2byte
cea0: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b  (&aData[iAddr]);
ceb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
cec0: 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 20 73  ress of a free s
ced0: 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 78 3b 20  lot */.  int x; 
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 2f 2a 20 45 78 63 65 73 73 20 73 69      /* Excess si
cf10: 7a 65 20 6f 66 20 74 68 65 20 73 6c 6f 74 20 2a  ze of the slot *
cf20: 2f 0a 20 20 69 6e 74 20 6d 61 78 50 43 20 3d 20  /.  int maxPC = 
cf30: 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
cf40: 53 69 7a 65 20 2d 20 6e 42 79 74 65 3b 20 20 2f  Size - nByte;  /
cf50: 2a 20 4d 61 78 20 61 64 64 72 65 73 73 20 66 6f  * Max address fo
cf60: 72 20 61 20 75 73 61 62 6c 65 20 73 6c 6f 74 20  r a usable slot 
cf70: 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20  */.  int size;  
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
cfb0: 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20 61  ree slot */..  a
cfc0: 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20  ssert( pc>0 );. 
cfd0: 20 77 68 69 6c 65 28 20 70 63 3c 3d 6d 61 78 50   while( pc<=maxP
cfe0: 43 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  C ){.    /* EVID
cff0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
d000: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
d010: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
d020: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
d030: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
d040: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
d050: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
d060: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
d070: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
d080: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
d090: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
d0a0: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
d0b0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
d0c0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
d0d0: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
d0e0: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
d0f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
d100: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
d110: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
d120: 20 20 20 69 66 28 20 78 3c 34 20 29 7b 0a 20 20     if( x<4 ){.  
d130: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
d140: 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d 35 38  E-OF: R-11498-58
d150: 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  022 In a well-fo
d160: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
d170: 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 20 20  , the total.    
d180: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
d190: 20 62 79 74 65 73 20 69 6e 20 66 72 61 67 6d 65   bytes in fragme
d1a0: 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78 63 65  nts may not exce
d1b0: 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ed 60. */.      
d1c0: 20 20 69 66 28 20 61 44 61 74 61 5b 68 64 72 2b    if( aData[hdr+
d1d0: 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e 20 30  7]>57 ) return 0
d1e0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;..        /* Re
d1f0: 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20 66 72  move the slot fr
d200: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
d210: 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e 75 6d  . Update the num
d220: 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ber of.        *
d230: 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74  * fragmented byt
d240: 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  es within the pa
d250: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d  ge. */.        m
d260: 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69 41 64  emcpy(&aData[iAd
d270: 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c  dr], &aData[pc],
d280: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 44 61   2);.        aDa
d290: 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38  ta[hdr+7] += (u8
d2a0: 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  )x;.      }else 
d2b0: 69 66 28 20 78 2b 70 63 20 3e 20 6d 61 78 50 43  if( x+pc > maxPC
d2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
d2d0: 68 69 73 20 73 6c 6f 74 20 65 78 74 65 6e 64 73  his slot extends
d2e0: 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20   off the end of 
d2f0: 74 68 65 20 75 73 61 62 6c 65 20 70 61 72 74 20  the usable part 
d300: 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
d310: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
d320: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
d330: 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  E(pPg);.        
d340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
d350: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
d360: 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61 69  * The slot remai
d370: 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ns on the free-l
d380: 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73 20  ist. Reduce its 
d390: 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a  size to account.
d3a0: 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74          ** for t
d3b0: 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20  he portion used 
d3c0: 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  by the new alloc
d3d0: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
d3e0: 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
d3f0: 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20  a[pc+2], x);.   
d400: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
d410: 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d  n &aData[pc + x]
d420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64  ;.    }.    iAdd
d430: 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d  r = pc;.    pc =
d440: 20 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61   get2byte(&aData
d450: 5b 70 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  [pc]);.    if( p
d460: 63 3c 69 41 64 64 72 2b 73 69 7a 65 20 29 7b 0a  c<iAddr+size ){.
d470: 20 20 20 20 20 20 69 66 28 20 70 63 20 29 7b 0a        if( pc ){.
d480: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
d490: 65 78 74 20 73 6c 6f 74 20 69 6e 20 74 68 65 20  ext slot in the 
d4a0: 63 68 61 69 6e 20 69 73 20 6e 6f 74 20 70 61 73  chain is not pas
d4b0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
d4c0: 20 63 75 72 72 65 6e 74 20 73 6c 6f 74 20 2a 2f   current slot */
d4d0: 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20  .        *pRc = 
d4e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
d4f0: 41 47 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20  AGE(pPg);.      
d500: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  }.      return 0
d510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d520: 28 20 70 63 3e 6d 61 78 50 43 2b 6e 42 79 74 65  ( pc>maxPC+nByte
d530: 2d 34 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  -4 ){.    /* The
d540: 20 66 72 65 65 20 73 6c 6f 74 20 63 68 61 69 6e   free slot chain
d550: 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65   extends off the
d560: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
d570: 20 2a 2f 0a 20 20 20 20 2a 70 52 63 20 3d 20 53   */.    *pRc = S
d580: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
d590: 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  GE(pPg);.  }.  r
d5a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
d5b0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65  * Allocate nByte
d5c0: 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
d5d0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65 20  from within the 
d5e0: 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73 73  B-Tree page pass
d5f0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
d600: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72 69  st argument. Wri
d610: 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74 68  te into *pIdx th
d620: 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61  e index into pPa
d630: 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f  ge->aData[].** o
d640: 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  f the first byte
d650: 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73 70   of allocated sp
d660: 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74 68  ace. Return eith
d670: 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a  er SQLITE_OK or.
d680: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** an error code
d690: 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54 45   (usually SQLITE
d6a0: 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
d6b0: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
d6c0: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
d6d0: 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  e is sufficient 
d6e0: 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74 68  space to make th
d6f0: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e  e.** allocation.
d700: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
d710: 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65 66  ight need to def
d720: 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72  ragment in order
d730: 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c   to bring.** all
d740: 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65 74   the space toget
d750: 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20 54  her, however.  T
d760: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
d770: 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20   avoid using.** 
d780: 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62 79  the first two by
d790: 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65 6c  tes past the cel
d7a0: 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20 73  l pointer area s
d7b0: 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79 20  ince presumably 
d7c0: 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  this.** allocati
d7d0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64 65  on is being made
d7e0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 73   in order to ins
d7f0: 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20  ert a new cell, 
d800: 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c  so we will.** al
d810: 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69 6e  so end up needin
d820: 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69  g a new cell poi
d830: 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nter..*/.static 
d840: 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  int allocateSpac
d850: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
d860: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
d870: 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74   *pIdx){.  const
d880: 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67 65   int hdr = pPage
d890: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
d8a0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
d8b0: 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  f pPage->hdrOffs
d8c0: 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e  et */.  u8 * con
d8d0: 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  st data = pPage-
d8e0: 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  >aData;      /* 
d8f0: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
d900: 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
d910: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
d940: 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74  yte of cell cont
d950: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ent area */.  in
d960: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d980: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72 65     /* Integer re
d990: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
d9a0: 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20 2f  nt gap;        /
d9b0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d9c0: 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c 6c  gap between cell
d9d0: 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63 65   pointers and ce
d9e0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ll content */.  
d9f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
da00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
da10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
da20: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
da30: 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20  pPage->pBt );.  
da40: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
da50: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
da60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
da70: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
da80: 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d  >=0 );  /* Minim
da90: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
daa0: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  4 */.  assert( p
dab0: 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79  Page->nFree>=nBy
dac0: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
dad0: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
dae0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
daf0: 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28 70   nByte < (int)(p
db00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
db10: 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61  eSize-8) );..  a
db20: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 65  ssert( pPage->ce
db30: 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72 20  llOffset == hdr 
db40: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
db50: 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d 20  leaf );.  gap = 
db60: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
db70: 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65  t + 2*pPage->nCe
db80: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67 61  ll;.  assert( ga
db90: 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a  p<=65536 );.  /*
dba0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
dbb0: 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20 74  29356-02391 If t
dbc0: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65 73  he database uses
dbd0: 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70 61   a 65536-byte pa
dbe0: 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64  ge size.  ** and
dbf0: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73 70   the reserved sp
dc00: 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68 65  ace is zero (the
dc10: 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f 72   usual value for
dc20: 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65 29   reserved space)
dc30: 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 63  .  ** then the c
dc40: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73  ell content offs
dc50: 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20 70  et of an empty p
dc60: 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65 20  age wants to be 
dc70: 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65  65536..  ** Howe
dc80: 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67 65  ver, that intege
dc90: 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 74  r is too large t
dca0: 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 61  o be stored in a
dcb0: 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   2-byte unsigned
dcc0: 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73  .  ** integer, s
dcd0: 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20 69  o a value of 0 i
dce0: 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70 6c  s used in its pl
dcf0: 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  ace. */.  top = 
dd00: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
dd10: 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72 74  dr+5]);.  assert
dd20: 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67  ( top<=(int)pPag
dd30: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
dd40: 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74  ze ); /* Prevent
dd50: 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50 61   by getAndInitPa
dd60: 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67 61  ge() */.  if( ga
dd70: 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66 28  p>top ){.    if(
dd80: 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67 65   top==0 && pPage
dd90: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
dda0: 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20 20  e==65536 ){.    
ddb0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
ddc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ddd0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dde0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
ddf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
de00: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
de10: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
de20: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
de30: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
de40: 6c 20 70 6f 69 6e 74 65 72 2c 0a 20 20 2a 2a 20  l pointer,.  ** 
de50: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
de60: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
de70: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
de80: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
de90: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
dea0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
deb0: 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71   satisfy the req
dec0: 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  uest..  */.  tes
ded0: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
dee0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
def0: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
df00: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
df10: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61  top );.  if( (da
df20: 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74  ta[hdr+2] || dat
df30: 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70  a[hdr+1]) && gap
df40: 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75  +2<=top ){.    u
df50: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
df60: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
df70: 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20  nByte, &rc);.   
df80: 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20   if( pSpace ){. 
df90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70       assert( pSp
dfa0: 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53  ace>=data && (pS
dfb0: 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35  pace - data)<655
dfc0: 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64  36 );.      *pId
dfd0: 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65  x = (int)(pSpace
dfe0: 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20   - data);.      
dff0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e000: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e010: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
e020: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
e030: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
e040: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
e050: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
e060: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
e070: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
e080: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
e090: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
e0a0: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
e0b0: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
e0c0: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
e0d0: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
e0e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e0f0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
e100: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
e110: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e120: 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
e130: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
e140: 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e  tPage(pPage, MIN
e150: 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  (4, pPage->nFree
e160: 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a   - (2+nByte)));.
e170: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
e180: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
e190: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
e1a0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
e1b0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
e1c0: 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  +2+nByte<=top );
e1d0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
e1e0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
e1f0: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
e200: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
e210: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
e220: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
e230: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
e240: 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65  btreeComputeFree
e250: 53 70 61 63 65 28 29 20 63 61 6c 6c 20 68 61 73  Space() call has
e260: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
e270: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
e280: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
e290: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
e2a0: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
e2b0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
e2c0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
e2d0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
e2e0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
e2f0: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
e300: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
e310: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
e320: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
e330: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
e340: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
e350: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
e360: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
e370: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
e380: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e390: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
e3a0: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
e3b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e3c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
e3d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
e3e0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
e3f0: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
e400: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
e410: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
e420: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74  k is pPage->aDat
e430: 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  a[iStart].** and
e440: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e450: 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20   block is iSize 
e460: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a  bytes..**.** Adj
e470: 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73  acent freeblocks
e480: 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a   are coalesced..
e490: 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67  **.** Even thoug
e4a0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
e4b0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
e4c0: 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65   by btreeCompute
e4d0: 46 72 65 65 53 70 61 63 65 28 29 2c 0a 2a 2a 20  FreeSpace(),.** 
e4e0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
e4f0: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
e500: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
e510: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
e520: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
e530: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
e540: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
e550: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
e560: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
e570: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
e580: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
e590: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
e5a0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
e5b0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
e5c0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
e5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e5e0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
e5f0: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
e600: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
e610: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
e620: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
e630: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
e640: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
e650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e660: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e670: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
e680: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
e690: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e6c0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
e6d0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
e6e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
e710: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
e720: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
e730: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e740: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e750: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
e760: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
e770: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
e780: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
e790: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
e7a0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
e7b0: 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20  /.  u16 x;      
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
e7e0: 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
e7f0: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33  ent area */.  u3
e800: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
e810: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
e820: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
e830: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
e840: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
e850: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e860: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
e870: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
e880: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
e890: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e8a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e8b0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e8c0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e8d0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e8e0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
e8f0: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
e900: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
e910: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
e920: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
e930: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
e940: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
e950: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
e960: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e970: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
e980: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e990: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
e9a0: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
e9b0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
e9c0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
e9d0: 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74  tart<=pPage->pBt
e9e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
e9f0: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  ;..  /* The list
ea00: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d   of freeblocks m
ea10: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
ea20: 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64  ing order.  Find
ea30: 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20   the .  ** spot 
ea40: 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72  on the list wher
ea50: 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  e iStart should 
ea60: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  be inserted..  *
ea70: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
ea80: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50  >hdrOffset;.  iP
ea90: 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  tr = hdr + 1;.  
eaa0: 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d  if( data[iPtr+1]
eab0: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72  ==0 && data[iPtr
eac0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65  ]==0 ){.    iFre
ead0: 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68  eBlk = 0;  /* Sh
eae0: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
eaf0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65  ase when the fre
eb00: 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a  elist is empty *
eb10: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  /.  }else{.    w
eb20: 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20  hile( (iFreeBlk 
eb30: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
eb40: 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20  [iPtr]))<iStart 
eb50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
eb60: 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a  eeBlk<iPtr+4 ){.
eb70: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
eb80: 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eBlk==0 ) break;
eb90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
eba0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ebb0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
ebc0: 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d    }.      iPtr =
ebd0: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
ebe0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
ebf0: 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  k>pPage->pBt->us
ec00: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
ec10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ec20: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ec30: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
ec40: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
ec50: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
ec60: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
ec70: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
ec80: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
ec90: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
eca0: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
ecb0: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
ecc0: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
ecd0: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
ece0: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
ecf0: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
ed00: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
ed10: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
ed20: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
ed30: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
ed40: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
ed50: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
ed60: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
ed70: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
ed80: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
ed90: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
eda0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
edb0: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
edc0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
edd0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
ede0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
edf0: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
ee00: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
ee10: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
ee20: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
ee30: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
ee40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ee50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
ee60: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
ee70: 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  }.      iSize = 
ee80: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
ee90: 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
eea0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
eeb0: 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
eec0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
eed0: 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
eee0: 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
eef0: 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
ef00: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
ef10: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
ef20: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
ef30: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
ef40: 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
ef50: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
ef60: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
ef70: 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
ef80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
ef90: 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
efa0: 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
efb0: 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
efc0: 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
efd0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
efe0: 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
eff0: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
f000: 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
f010: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f020: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
f030: 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
f040: 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
f050: 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
f060: 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
f070: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
f080: 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
f090: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
f0a0: 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
f0b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f0c0: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
f0d0: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
f0e0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
f0f0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
f100: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f110: 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b  if( iStart<=x ){
f120: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
f130: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
f140: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f150: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f160: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
f170: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
f180: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f190: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
f1a0: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
f1b0: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
f1c0: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
f1d0: 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72  iStart<x || iPtr
f1e0: 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e  !=hdr+1 ) return
f1f0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f200: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
f210: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f220: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
f230: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
f240: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
f250: 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
f260: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
f270: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
f280: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
f290: 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
f2a0: 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
f2b0: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  art);.  }.  if( 
f2c0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
f2d0: 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
f2e0: 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a  SECURE ){.    /*
f2f0: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
f300: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
f310: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
f320: 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
f330: 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  .    ** option i
f340: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20  s enabled */.   
f350: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53   memset(&data[iS
f360: 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29  tart], 0, iSize)
f370: 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
f380: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
f390: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74  iFreeBlk);.  put
f3a0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
f3b0: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
f3c0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
f3d0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
f3e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f3f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
f400: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
f410: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
f420: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
f430: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
f440: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
f450: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
f460: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
f470: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
f480: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
f490: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
f4a0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
f4b0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
f4c0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
f4d0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
f4e0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
f4f0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
f500: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
f510: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
f520: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
f530: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
f540: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
f550: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
f560: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
f570: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
f580: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
f590: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
f5a0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
f5b0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
f5c0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
f5d0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
f5e0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
f5f0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
f600: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
f610: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
f620: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f630: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
f640: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
f650: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
f660: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
f670: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
f680: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
f690: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
f6a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
f6b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
f6c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
f6d0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
f6e0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
f6f0: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
f700: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
f710: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
f720: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
f730: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
f740: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
f750: 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c  7291-35328 A val
f760: 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d  ue of 5 (0x05) m
f770: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
f780: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
f790: 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ior table b-tree
f7a0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f7b0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
f7c0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d  ATA|PTF_INTKEY)=
f7d0: 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =5 );.    /* EVI
f7e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30  DENCE-OF: R-2690
f7f0: 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20  0-09176 A value 
f800: 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61  of 13 (0x0d) mea
f810: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f820: 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62  .    ** leaf tab
f830: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f840: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f850: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f860: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
f870: 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
f880: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
f890: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
f8a0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eaf ){.      pPa
f8b0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
f8c0: 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   1;.      pPage-
f8d0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f8e0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b  reeParseCellPtr;
f8f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f900: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
f910: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
f920: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f930: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
f940: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
f950: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f960: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f970: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
f980: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
f990: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
f9a0: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
f9b0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
f9c0: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
f9d0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
f9e0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
f9f0: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
fa00: 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37  E-OF: R-43316-37
fa10: 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32  308 A value of 2
fa20: 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68   (0x02) means th
fa30: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
fa40: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64   ** interior ind
fa50: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
fa60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
fa70: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
fa80: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
fa90: 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d  NCE-OF: R-59615-
faa0: 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66  42828 A value of
fab0: 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73   10 (0x0a) means
fac0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
fad0: 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78     ** leaf index
fae0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
faf0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
fb00: 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c  F_ZERODATA|PTF_L
fb10: 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20  EAF)==10 );.    
fb20: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
fb30: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  0;.    pPage->in
fb40: 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
fb50: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
fb60: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
fb70: 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20  CellPtrIndex;.  
fb80: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
fb90: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
fba0: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
fbb0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
fbc0: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
fbd0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
fbe0: 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34  -OF: R-47608-564
fbf0: 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c  69 Any other val
fc00: 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65  ue for the b-tre
fc10: 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20  e page type is. 
fc20: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20     ** an error. 
fc30: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
fc40: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
fc50: 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
fc60: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
fc70: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
fc80: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
fc90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fca0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  K;.}../*.** Comp
fcb0: 75 74 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ute the amount o
fcc0: 66 20 66 72 65 65 73 70 61 63 65 20 6f 6e 20 74  f freespace on t
fcd0: 68 65 20 70 61 67 65 2e 20 20 49 6e 20 6f 74 68  he page.  In oth
fce0: 65 72 20 77 6f 72 64 73 2c 20 66 69 6c 6c 0a 2a  er words, fill.*
fcf0: 2a 20 69 6e 20 74 68 65 20 70 50 61 67 65 2d 3e  * in the pPage->
fd00: 6e 46 72 65 65 20 66 69 65 6c 64 2e 0a 2a 2f 0a  nFree field..*/.
fd10: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
fd20: 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65  ComputeFreeSpace
fd30: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
fd40: 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
fd50: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
fd60: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
fd70: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
fd80: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68  Data[] */.  u8 h
fd90: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
fda0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
fdb0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
fdc0: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
fdd0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
fde0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
fdf0: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75  aData */.  int u
fe00: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
fe10: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
fe20: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
fe30: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  page */.  int nF
fe40: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
fe50: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
fe60: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
fe70: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
fe80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
fe90: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
fea0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
feb0: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  a */.  int iCell
fec0: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
fed0: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
fee0: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
fef0: 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ffset */.  int i
ff00: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
ff10: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
ff20: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
ff30: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73   offset */..  as
ff40: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
ff50: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ff60: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
ff70: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ff80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ff90: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ffa0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ffb0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
ffc0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
ffd0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
ffe0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
fff0: 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
10000 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
10010 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
10020 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
10030 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
10040 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
10050 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
10060 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
10070 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 31  pPage->isInit==1
10080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10090 61 67 65 2d 3e 6e 46 72 65 65 3c 30 20 29 3b 0a  age->nFree<0 );.
100a0 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
100b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
100c0 6c 65 53 69 7a 65 3b 0a 20 20 68 64 72 20 3d 20  leSize;.  hdr = 
100d0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
100e0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
100f0 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56  ->aData;.  /* EV
10100 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30  IDENCE-OF: R-580
10110 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f  15-48175 The two
10120 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10130 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e   offset 5 design
10140 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74  ates.  ** the st
10150 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  art of the cell 
10160 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20  content area. A 
10170 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74  zero value for t
10180 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20  his integer is. 
10190 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
101a0 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74  as 65536. */.  t
101b0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
101c0 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
101d0 5d 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ]);.  iCellFirst
101e0 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61   = hdr + 8 + pPa
101f0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10200 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10210 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
10220 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10230 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
10240 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
10250 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
10260 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
10270 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20  : R-23588-34450 
10280 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
10290 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31  eger at offset 1
102a0 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20   gives the.  ** 
102b0 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
102c0 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
102d0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
102e0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
102f0 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c  e no.  ** freebl
10300 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20  ocks. */.  pc = 
10310 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
10320 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20  dr+1]);.  nFree 
10330 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
10340 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
10350 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
10360 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
10370 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b  */.  if( pc>0 ){
10380 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73  .    u32 next, s
10390 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  ize;.    if( pc<
103a0 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
103b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
103c0 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
103d0 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
103e0 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
103f0 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
10400 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
10410 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
10420 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10430 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
10440 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10450 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10460 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20  _PAGE(pPage); . 
10470 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
10480 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
10490 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
104a0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c         /* Freebl
104b0 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ock off the end 
104c0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
104d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
104e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
104f0 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10500 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
10510 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10520 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
10530 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10540 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46  pc+2]);.      nF
10550 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
10560 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ze;.      if( ne
10570 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20  xt<=pc+size+3 ) 
10580 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20  break;.      pc 
10590 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
105a0 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a    if( next>0 ){.
105b0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f        /* Freeblo
105c0 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64  ck not in ascend
105d0 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
105e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
105f0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10600 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
10610 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73  if( pc+size>(uns
10620 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65  igned int)usable
10630 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
10640 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20   Last freeblock 
10650 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61 67  extends past pag
10660 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72  e end */.      r
10670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10680 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10690 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
106a0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
106b0 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
106c0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
106d0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
106e0 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  rt.  ** of the c
106f0 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10700 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
10710 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
10720 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63  ithin.  ** the c
10730 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10740 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
10750 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
10760 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f  able-size.  ** o
10770 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
10780 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
10790 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
107a0 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a  s check also.  *
107b0 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
107c0 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
107d0 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
107e0 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
107f0 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61  ent.  ** area, a
10800 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
10810 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
10820 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
10830 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  e..  */.  if( nF
10840 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ree>usableSize )
10850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10860 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10870 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70  (pPage);.  }.  p
10880 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
10890 31 36 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c  16)(nFree - iCel
108a0 6c 46 69 72 73 74 29 3b 0a 20 20 72 65 74 75 72  lFirst);.  retur
108b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
108c0 2f 2a 0a 2a 2a 20 44 6f 20 61 64 64 69 74 69 6f  /*.** Do additio
108d0 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
108e0 20 61 66 74 65 72 20 62 74 72 65 65 49 6e 69 74   after btreeInit
108f0 50 61 67 65 28 29 20 69 66 0a 2a 2a 20 50 52 41  Page() if.** PRA
10900 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68  GMA cell_size_ch
10910 65 63 6b 3d 4f 4e 20 0a 2a 2f 0a 73 74 61 74 69  eck=ON .*/.stati
10920 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
10930 45 20 69 6e 74 20 62 74 72 65 65 43 65 6c 6c 53  E int btreeCellS
10940 69 7a 65 43 68 65 63 6b 28 4d 65 6d 50 61 67 65  izeCheck(MemPage
10950 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
10960 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 2f  iCellFirst;    /
10970 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
10980 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c  e cell or freebl
10990 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  ock offset */.  
109a0 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
109b0 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69     /* Last possi
109c0 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65 65  ble cell or free
109d0 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a  block offset */.
109e0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
109f0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
10a00 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
10a10 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
10a20 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
10a30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63    /* Size of a c
10a40 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ell */.  int pc;
10a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
10a60 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65  ddress of a free
10a70 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61  block within pPa
10a80 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20  ge->aData[] */. 
10a90 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
10aa0 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
10ab0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
10ac0 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
10ad0 3b 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  ;    /* Maximum 
10ae0 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
10af0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
10b00 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
10b10 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 63 65 6c   /* Start of cel
10b20 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
10b30 2f 0a 0a 20 20 69 43 65 6c 6c 46 69 72 73 74 20  /..  iCellFirst 
10b40 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
10b50 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
10b60 43 65 6c 6c 3b 0a 20 20 75 73 61 62 6c 65 53 69  Cell;.  usableSi
10b70 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
10b80 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
10b90 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
10ba0 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 64 61 74  eSize - 4;.  dat
10bb0 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
10bc0 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ;.  cellOffset =
10bd0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
10be0 65 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  et;.  if( !pPage
10bf0 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
10c00 73 74 2d 2d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  st--;.  for(i=0;
10c10 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
10c20 20 69 2b 2b 29 7b 0a 20 20 20 20 70 63 20 3d 20   i++){.    pc = 
10c30 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
10c40 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
10c50 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 74 65 73 74  +i*2]);.    test
10c60 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46  case( pc==iCellF
10c70 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74  irst );.    test
10c80 63 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c  case( pc==iCellL
10c90 61 73 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ast );.    if( p
10ca0 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
10cb0 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
10cc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
10cd0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
10ce0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
10cf0 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
10d00 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
10d10 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
10d20 74 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d  testcase( pc+sz=
10d30 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  =usableSize );. 
10d40 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
10d50 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
10d60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10d70 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10d80 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
10d90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10da0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
10db0 61 6c 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69  alize the auxili
10dc0 61 72 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ary information 
10dd0 66 6f 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b  for a disk block
10de0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
10df0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10e00 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65 20  ess.  If we see 
10e10 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64 6f  that the page do
10e20 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69  es.** not contai
10e30 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
10e40 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 74  database page, t
10e50 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53  hen return .** S
10e60 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20  QLITE_CORRUPT.  
10e70 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74 75  Note that a retu
10e80 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20  rn of SQLITE_OK 
10e90 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72  does not.** guar
10ea0 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20 70  antee that the p
10eb0 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d  age is well-form
10ec0 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f  ed.  It only sho
10ed0 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61  ws that.** we fa
10ee0 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 61  iled to detect a
10ef0 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  ny corruption..*
10f00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10f10 65 65 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61  eeInitPage(MemPa
10f20 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 38  ge *pPage){.  u8
10f30 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
10f40 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
10f50 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
10f60 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
10f70 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
10f80 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
10f90 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
10fa0 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
10fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
10fc0 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
10fd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10fe0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
10ff0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
11000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11010 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
11020 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
11030 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
11050 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
11060 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11070 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11080 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
11090 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
110a0 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
110b0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
110c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
110d0 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20  isInit==0 );..  
110e0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
110f0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
11100 2d 3e 61 44 61 74 61 20 2b 20 70 50 61 67 65 2d  ->aData + pPage-
11110 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 2f 2a  >hdrOffset;.  /*
11120 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
11130 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
11140 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
11150 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
11160 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d  ting.  ** the b-
11170 74 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20  tree page type. 
11180 2a 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46  */.  if( decodeF
11190 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
111a0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [0]) ){.    retu
111b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
111c0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
111d0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74   }.  assert( pBt
111e0 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
111f0 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
11200 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
11210 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
11220 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
11230 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
11240 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
11250 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
11260 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 68 64  fset = pPage->hd
11270 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
11280 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
11290 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  e;.  pPage->aCel
112a0 6c 49 64 78 20 3d 20 64 61 74 61 20 2b 20 70 50  lIdx = data + pP
112b0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
112c0 65 20 2b 20 38 3b 0a 20 20 70 50 61 67 65 2d 3e  e + 8;.  pPage->
112d0 61 44 61 74 61 45 6e 64 20 3d 20 70 50 61 67 65  aDataEnd = pPage
112e0 2d 3e 61 44 61 74 61 20 2b 20 70 42 74 2d 3e 75  ->aData + pBt->u
112f0 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
11300 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
11310 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20 70  pPage->aData + p
11320 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
11330 7a 65 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  ze;.  /* EVIDENC
11340 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33 32  E-OF: R-37002-32
11350 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74 65  774 The two-byte
11360 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
11370 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a 20  et 3 gives the. 
11380 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 65   ** number of ce
11390 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e  lls on the page.
113a0 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65   */.  pPage->nCe
113b0 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
113c0 61 74 61 5b 33 5d 29 3b 0a 20 20 69 66 28 20 70  ata[3]);.  if( p
113d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
113e0 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
113f0 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
11400 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
11410 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
11420 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
11430 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11440 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
11450 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65  pPage);.  }.  te
11460 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
11470 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
11480 74 29 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  t) );.  /* EVIDE
11490 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d  NCE-OF: R-24089-
114a0 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65 20  57979 If a page 
114b0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
114c0 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79  s (which is only
114d0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66  .  ** possible f
114e0 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
114f0 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
11500 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
11510 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f   then the.  ** o
11520 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  ffset to the cel
11530 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77  l content area w
11540 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61  ill equal the pa
11550 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68  ge size minus th
11560 65 0a 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20  e.  ** bytes of 
11570 72 65 73 65 72 76 65 64 20 73 70 61 63 65 2e 20  reserved space. 
11580 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
11590 67 65 2d 3e 6e 43 65 6c 6c 3e 30 0a 20 20 20 20  ge->nCell>0.    
115a0 20 20 20 7c 7c 20 67 65 74 32 62 79 74 65 4e 6f     || get2byteNo
115b0 74 5a 65 72 6f 28 26 64 61 74 61 5b 35 5d 29 3d  tZero(&data[5])=
115c0 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
115d0 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
115e0 50 54 5f 44 42 20 29 3b 0a 20 20 70 50 61 67 65  PT_DB );.  pPage
115f0 2d 3e 6e 46 72 65 65 20 3d 20 2d 31 3b 20 20 2f  ->nFree = -1;  /
11600 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
11610 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 79 65  this value is ye
11620 74 20 75 6e 63 6f 6d 70 75 74 65 64 20 2a 2f 0a  t uncomputed */.
11630 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
11640 3d 20 31 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  = 1;.  if( pBt->
11650 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11660 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
11670 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
11680 65 43 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28 70  eCellSizeCheck(p
11690 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
116a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
116b0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61  ../*.** Set up a
116c0 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61   raw page so tha
116d0 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  t it looks like 
116e0 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
116f0 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e  holding.** no en
11700 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tries..*/.static
11710 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d   void zeroPage(M
11720 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
11730 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73  nt flags){.  uns
11740 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
11750 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
11760 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
11770 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
11780 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d   u8 hdr = pPage-
11790 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31  >hdrOffset;.  u1
117a0 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65  6 first;..  asse
117b0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
117c0 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
117d0 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
117e0 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73  e->pgno );.  ass
117f0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
11800 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
11810 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
11820 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
11830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11840 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
11850 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61  ->pDbPage) == da
11860 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
11870 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
11880 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
11890 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
118a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
118b0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
118c0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ex) );.  if( pBt
118d0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
118e0 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a  _FAST_SECURE ){.
118f0 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61      memset(&data
11900 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75  [hdr], 0, pBt->u
11910 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29  sableSize - hdr)
11920 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72  ;.  }.  data[hdr
11930 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73 3b  ] = (char)flags;
11940 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b  .  first = hdr +
11950 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45 41   ((flags&PTF_LEA
11960 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29 3b  F)==0 ? 12 : 8);
11970 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
11980 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20  hdr+1], 0, 4);. 
11990 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30   data[hdr+7] = 0
119a0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
119b0 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d 3e  ta[hdr+5], pBt->
119c0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 70  usableSize);.  p
119d0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75  Page->nFree = (u
119e0 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
119f0 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20 20  ize - first);.  
11a00 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
11a10 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50 61  e, flags);.  pPa
11a20 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
11a30 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d   first;.  pPage-
11a40 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61 74  >aDataEnd = &dat
11a50 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
11a60 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65  e];.  pPage->aCe
11a70 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66 69  llIdx = &data[fi
11a80 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61  rst];.  pPage->a
11a90 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61  DataOfst = &data
11aa0 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  [pPage->childPtr
11ab0 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  Size];.  pPage->
11ac0 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
11ad0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 61   assert( pBt->pa
11ae0 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
11af0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35  Bt->pageSize<=65
11b00 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  536 );.  pPage->
11b10 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29  maskPage = (u16)
11b20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
11b30 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 43   1);.  pPage->nC
11b40 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ell = 0;.  pPage
11b50 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d 0a  ->isInit = 1;.}.
11b60 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
11b70 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e 65  a DbPage obtaine
11b80 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  d from the pager
11b90 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65 20   into a MemPage 
11ba0 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 62  used by.** the b
11bb0 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a 73  tree layer..*/.s
11bc0 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62  tatic MemPage *b
11bd0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11be0 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50 61  ge(DbPage *pDbPa
11bf0 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 42  ge, Pgno pgno, B
11c00 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
11c10 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
11c20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
11c30 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11c40 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
11c50 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70 67   pgno!=pPage->pg
11c60 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  no ){.    pPage-
11c70 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
11c80 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
11c90 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Page);.    pPage
11ca0 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
11cb0 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  age;.    pPage->
11cc0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 70  pBt = pBt;.    p
11cd0 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e  Page->pgno = pgn
11ce0 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 64  o;.    pPage->hd
11cf0 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d 3d  rOffset = pgno==
11d00 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20 7d  1 ? 100 : 0;.  }
11d10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11d20 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
11d30 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
11d40 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
11d50 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
11d60 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
11d70 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
11d80 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
11d90 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
11da0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
11db0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
11dc0 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
11dd0 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
11de0 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
11df0 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11e00 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
11e10 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
11e20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
11e30 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
11e40 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
11e50 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
11e60 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
11e70 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
11e80 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
11e90 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
11ea0 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
11eb0 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
11ec0 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
11ed0 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
11ee0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
11ef0 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
11f00 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
11f10 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
11f20 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
11f30 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
11f40 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
11f50 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
11f60 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
11f70 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
11f80 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
11f90 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
11fa0 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
11fb0 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
11fc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
11fd0 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
11fe0 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
11ff0 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
12000 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
12010 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
12020 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
12030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
12040 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
12050 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
12060 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
12070 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
12080 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
12090 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
120a0 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
120b0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
120c0 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
120d0 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
120e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
120f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
12100 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
12110 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
12120 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
12130 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
12140 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  DbPage, flags);.
12150 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12160 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20  n rc;.  *ppPage 
12170 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44  = btreePageFromD
12180 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70  bPage(pDbPage, p
12190 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74  gno, pBt);.  ret
121a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
121b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65  ../*.** Retrieve
121c0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
121d0 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
121e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
121f0 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c  age is not.** al
12200 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67  ready in the pag
12210 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20  er cache return 
12220 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65  NULL. Initialize
12230 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74   the MemPage.pBt
12240 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e   and.** MemPage.
12250 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69  aData elements i
12260 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  f needed..*/.sta
12270 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72  tic MemPage *btr
12280 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53  eePageLookup(BtS
12290 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
122a0 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65   pgno){.  DbPage
122b0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
122c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
122d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
122e0 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65  ex) );.  pDbPage
122f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c   = sqlite3PagerL
12300 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65  ookup(pBt->pPage
12310 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
12320 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72  pDbPage ){.    r
12330 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46  eturn btreePageF
12340 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
12350 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
12360 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
12370 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
12380 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  he size of the d
12390 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
123a0 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20  pages. If there 
123b0 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a  is any kind of.*
123c0 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20  * error, return 
123d0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d  ((unsigned int)-
123e0 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  1)..*/.static Pg
123f0 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  no btreePagecoun
12400 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
12410 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  {.  return pBt->
12420 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71 6c  nPage;.}.u32 sql
12430 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61 67  ite3BtreeLastPag
12440 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  e(Btree *p){.  a
12450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
12460 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
12470 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 28   );.  assert( ((
12480 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26 30  p->pBt->nPage)&0
12490 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29 3b  x80000000)==0 );
124a0 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50  .  return btreeP
124b0 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74 29  agecount(p->pBt)
124c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  ;.}../*.** Get a
124d0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
124e0 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61 6c  ager and initial
124f0 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ize it..**.** If
12500 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74 68   pCur!=0 then th
12510 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
12520 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74 20  fetched as part 
12530 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64  of a moveToChild
12540 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f 20  ().** call.  Do 
12550 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
12560 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
12570 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  e page in this c
12580 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20 74  ase..** And if t
12590 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c 20  he fetch fails, 
125a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  this routine mus
125b0 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75 72  t decrement pCur
125c0 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ->iPage..**.** T
125d0 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63 68  he page is fetch
125e0 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74 65  ed as read-write
125f0 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73 20   unless pCur is 
12600 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73 0a  not NULL and is.
12610 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  ** a read-only c
12620 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
12630 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
12640 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
12650 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a 2a   undefined. It.*
12660 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e 63  * may remain unc
12670 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d 61  hanged, or it ma
12680 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20 69  y be set to an i
12690 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a 2f  nvalid value..*/
126a0 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
126b0 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
126c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
126e0 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
126f0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  le */.  Pgno pgn
12700 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
12710 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
12720 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
12730 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67   get */.  MemPag
12740 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20  e **ppPage,     
12750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
12760 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e  te the page poin
12770 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42 74  ter here */.  Bt
12780 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
127a0 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65 69   Cursor to recei
127b0 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  ve the page, or 
127c0 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 52  NULL */.  int bR
127d0 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20 20  eadOnly         
127e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
127f0 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
12800 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69  y page */.){.  i
12810 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65 20  nt rc;.  DbPage 
12820 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
12830 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
12840 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
12850 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12860 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61 67  pCur==0 || ppPag
12870 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65 20  e==&pCur->pPage 
12880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
12890 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e 6c  r==0 || bReadOnl
128a0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67 65  y==pCur->curPage
128b0 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73 65  rFlags );.  asse
128c0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
128d0 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
128e0 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72 65  .  if( pgno>btre
128f0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20  ePagecount(pBt) 
12900 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12910 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
12920 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64  .    goto getAnd
12930 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31 3b  InitPage_error1;
12940 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
12950 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12960 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12970 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12980 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
12990 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
129a0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
129b0 67 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20  ge_error1;.  }. 
129c0 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50   *ppPage = (MemP
129d0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
129e0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
129f0 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61  e);.  if( (*ppPa
12a00 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
12a10 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46  {.    btreePageF
12a20 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
12a30 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
12a40 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
12a50 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
12a60 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12a70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
12a80 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
12a90 67 65 5f 65 72 72 6f 72 32 3b 0a 20 20 20 20 7d  ge_error2;.    }
12aa0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28  .  }.  assert( (
12ab0 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d  *ppPage)->pgno==
12ac0 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
12ad0 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61  ( (*ppPage)->aDa
12ae0 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ta==sqlite3Pager
12af0 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
12b00 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74   );..  /* If obt
12b10 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70  aining a child p
12b20 61 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72  age for a cursor
12b30 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79  , we must verify
12b40 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
12b50 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c  s.  ** compatibl
12b60 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20  e with the root 
12b70 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70  page. */.  if( p
12b80 43 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65  Cur && ((*ppPage
12b90 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a  )->nCell<1 || (*
12ba0 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21  ppPage)->intKey!
12bb0 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
12bc0 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
12bd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
12be0 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 67 6f 74  O(pgno);.    got
12bf0 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
12c00 5f 65 72 72 6f 72 32 3b 0a 20 20 7d 0a 20 20 72  _error2;.  }.  r
12c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12c20 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  ..getAndInitPage
12c30 5f 65 72 72 6f 72 32 3a 0a 20 20 72 65 6c 65 61  _error2:.  relea
12c40 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
12c50 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
12c60 65 72 72 6f 72 31 3a 0a 20 20 69 66 28 20 70 43  error1:.  if( pC
12c70 75 72 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  ur ){.    pCur->
12c80 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 70 43 75  iPage--;.    pCu
12c90 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
12ca0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
12cb0 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age];.  }.  test
12cc0 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30 20 29 3b  case( pgno==0 );
12cd0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
12ce0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
12cf0 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20 20 72 65  _CORRUPT );.  re
12d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12d10 2a 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50  * Release a MemP
12d20 61 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c  age.  This shoul
12d30 64 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  d be called once
12d40 20 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a   for each prior.
12d50 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12d60 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50  GetPage..**.** P
12d70 61 67 65 31 20 69 73 20 61 20 73 70 65 63 69 61  age1 is a specia
12d80 6c 20 63 61 73 65 20 61 6e 64 20 6d 75 73 74 20  l case and must 
12d90 62 65 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  be released usin
12da0 67 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  g releasePageOne
12db0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
12dc0 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
12dd0 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
12de0 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
12df0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
12e00 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12e10 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
12e20 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
12e30 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
12e40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
12e50 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
12e60 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
12e70 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
12e80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
12e90 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
12ea0 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
12eb0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
12ec0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12ed0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
12ee0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
12ef0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
12f00 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
12f10 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
12f20 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
12f30 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
12f40 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
12f50 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
12f60 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 73 74  ull(pPage);.}.st
12f70 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
12f80 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50 61 67 65  ePageOne(MemPage
12f90 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
12fa0 72 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a  rt( pPage!=0 );.
12fb0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12fc0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12fd0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
12fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12ff0 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
13000 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
13010 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
13020 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
13030 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
13040 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13050 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
13060 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
13070 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
13080 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
13090 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
130a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
130b0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
130c0 67 65 72 55 6e 72 65 66 50 61 67 65 4f 6e 65 28  gerUnrefPageOne(
130d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
130e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e  .}../*.** Get an
130f0 20 75 6e 75 73 65 64 20 70 61 67 65 2e 0a 2a 2a   unused page..**
13100 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 6a  .** This works j
13110 75 73 74 20 6c 69 6b 65 20 62 74 72 65 65 47 65  ust like btreeGe
13120 74 50 61 67 65 28 29 20 77 69 74 68 20 74 68 65  tPage() with the
13130 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a   addition:.**.**
13140 20 20 20 2a 20 20 49 66 20 74 68 65 20 70 61 67     *  If the pag
13150 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
13160 75 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  use for some oth
13170 65 72 20 70 75 72 70 6f 73 65 2c 20 69 6d 6d 65  er purpose, imme
13180 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20  diately.**      
13190 72 65 6c 65 61 73 65 20 69 74 20 61 6e 64 20 72  release it and r
131a0 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f  eturn an SQLITE_
131b0 43 55 52 52 55 50 54 20 65 72 72 6f 72 2e 0a 2a  CURRUPT error..*
131c0 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73 75 72 65  *   *  Make sure
131d0 20 74 68 65 20 69 73 49 6e 69 74 20 66 6c 61 67   the isInit flag
131e0 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a 73 74 61   is clear.*/.sta
131f0 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
13200 55 6e 75 73 65 64 50 61 67 65 28 0a 20 20 42 74  UnusedPage(.  Bt
13210 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
13220 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
13230 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
13240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
13250 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
13260 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
13270 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
13280 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
13290 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
132a0 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
132b0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
132c0 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
132d0 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
132e0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
132f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
13300 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
13310 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  , pgno, ppPage, 
13320 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
13330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
13340 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13350 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
13360 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
13370 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
13380 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
13390 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
133a0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ge = 0;.      re
133b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
133c0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
133d0 20 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69      (*ppPage)->i
133e0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 65 6c  sInit = 0;.  }el
133f0 73 65 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20  se{.    *ppPage 
13400 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
13410 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
13420 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63  During a rollbac
13430 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  k, when the page
13440 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72 6d  r reloads inform
13450 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 63  ation into the c
13460 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20  ache.** so that 
13470 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65 73  the cache is res
13480 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
13490 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20 74  ginal state at t
134a0 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
134b0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
134c0 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72 65  for each page re
134d0 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75 74  stored this rout
134e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
134f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13500 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65 74  e needs to reset
13510 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61 20   the extra data 
13520 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20 65  section at the e
13530 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 67  nd of the.** pag
13540 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  e to agree with 
13550 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61 74  the restored dat
13560 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  a..*/.static voi
13570 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62 50  d pageReinit(DbP
13580 61 67 65 20 2a 70 44 61 74 61 29 7b 0a 20 20 4d  age *pData){.  M
13590 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
135a0 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67   pPage = (MemPag
135b0 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  e *)sqlite3Pager
135c0 47 65 74 45 78 74 72 61 28 70 44 61 74 61 29 3b  GetExtra(pData);
135d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
135e0 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
135f0 75 6e 74 28 70 44 61 74 61 29 3e 30 20 29 3b 0a  unt(pData)>0 );.
13600 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
13610 6e 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  nit ){.    asser
13620 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
13630 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
13640 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20  ->mutex) );.    
13650 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
13660 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
13670 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
13680 75 6e 74 28 70 44 61 74 61 29 3e 31 20 29 7b 0a  unt(pData)>1 ){.
13690 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 6d        /* pPage m
136a0 69 67 68 74 20 6e 6f 74 20 62 65 20 61 20 62 74  ight not be a bt
136b0 72 65 65 20 70 61 67 65 3b 20 20 69 74 20 6d 69  ree page;  it mi
136c0 67 68 74 20 62 65 20 61 6e 20 6f 76 65 72 66 6c  ght be an overfl
136d0 6f 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ow page.      **
136e0 20 6f 72 20 70 74 72 6d 61 70 20 70 61 67 65 20   or ptrmap page 
136f0 6f 72 20 61 20 66 72 65 65 20 70 61 67 65 2e 20  or a free page. 
13700 20 49 6e 20 74 68 6f 73 65 20 63 61 73 65 73 2c   In those cases,
13710 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
13720 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20       ** call to 
13730 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20  btreeInitPage() 
13740 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 74 75  will likely retu
13750 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
13760 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42 75 74 20  T..      ** But 
13770 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f 6e 65 20  no harm is done 
13780 62 79 20 74 68 69 73 2e 20 20 41 6e 64 20 69 74  by this.  And it
13790 20 69 73 20 76 65 72 79 20 69 6d 70 6f 72 74 61   is very importa
137a0 6e 74 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  nt that.      **
137b0 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
137c0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 65 76   be called on ev
137d0 65 72 79 20 62 74 72 65 65 20 70 61 67 65 20 73  ery btree page s
137e0 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 20  o we make.      
137f0 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66 6f 72 20  ** the call for 
13800 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 20  every page that 
13810 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20 72 65 2d  comes in for re-
13820 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  initing. */.    
13830 20 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28    btreeInitPage(
13840 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
13850 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
13860 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
13870 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
13880 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
13890 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
138a0 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
138b0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
138c0 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
138d0 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
138e0 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
138f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
13900 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
13910 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
13920 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
13930 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
13940 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
13950 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13970 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
13980 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
13990 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  r));.}../*.** Op
139a0 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
139b0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65  le..** .** zFile
139c0 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  name is the name
139d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
139e0 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65   file.  If zFile
139f0 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20  name is NULL.** 
13a00 74 68 65 6e 20 61 6e 20 65 70 68 65 6d 65 72 61  then an ephemera
13a10 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  l database is cr
13a20 65 61 74 65 64 2e 20 20 54 68 65 20 65 70 68 65  eated.  The ephe
13a30 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 6d  meral database m
13a40 69 67 68 74 0a 2a 2a 20 62 65 20 65 78 63 6c 75  ight.** be exclu
13a50 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79  sively in memory
13a60 2c 20 6f 72 20 69 74 20 6d 69 67 68 74 20 75 73  , or it might us
13a70 65 20 61 20 64 69 73 6b 2d 62 61 73 65 64 20 6d  e a disk-based m
13a80 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a 2a 2a 20  emory cache..** 
13a90 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65 20  Either way, the 
13aa0 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
13ab0 73 65 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  se will be autom
13ac0 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
13ad0 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c 69 74 65   .** when sqlite
13ae0 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73  3BtreeClose() is
13af0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   called..**.** I
13b00 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
13b10 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
13b20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
13b30 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 0a  base is created.
13b40 2a 2a 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d  ** that is autom
13b50 61 74 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79  atically destroy
13b60 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ed when it is cl
13b70 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  osed..**.** The 
13b80 22 66 6c 61 67 73 22 20 70 61 72 61 6d 65 74 65  "flags" paramete
13b90 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74  r is a bitmask t
13ba0 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  hat might contai
13bb0 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a 2a 20 42  n bits like.** B
13bc0 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  TREE_OMIT_JOURNA
13bd0 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45 45 5f 4d  L and/or BTREE_M
13be0 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EMORY..**.** If 
13bf0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
13c00 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 69  already opened i
13c10 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  n the same datab
13c20 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
13c30 2a 20 61 6e 64 20 77 65 20 61 72 65 20 69 6e 20  * and we are in 
13c40 73 68 61 72 65 64 20 63 61 63 68 65 20 6d 6f 64  shared cache mod
13c50 65 2c 20 74 68 65 6e 20 74 68 65 20 6f 70 65 6e  e, then the open
13c60 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
13c70 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e  an.** SQLITE_CON
13c80 53 54 52 41 49 4e 54 20 65 72 72 6f 72 2e 20 20  STRAINT error.  
13c90 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20  We cannot allow 
13ca0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42 74 53 68  two or more BtSh
13cb0 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  ared.** objects 
13cc0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  in the same data
13cd0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
13ce0 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 77  since doing so w
13cf0 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74 6f 20 70  ill lead.** to p
13d00 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 6c 6f 63  roblems with loc
13d10 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  king..*/.int sql
13d20 69 74 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20  ite3BtreeOpen(. 
13d30 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
13d40 66 73 2c 20 20 20 20 20 20 2f 2a 20 56 46 53 20  fs,      /* VFS 
13d50 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20  to use for this 
13d60 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63 6f 6e 73  b-tree */.  cons
13d70 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
13d80 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
13d90 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
13da0 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
13db0 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
13dc0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
13dd0 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
13de0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
13df0 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
13e00 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
13e10 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
13e20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
13e30 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
13e40 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
13e50 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
13e60 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
13e70 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
13e80 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
13e90 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
13ea0 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
13eb0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
13ec0 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  pBt = 0;        
13ed0 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
13ee0 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
13ef0 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
13f00 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
13f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
13f20 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
13f30 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
13f40 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20 3d 20 30  x *mutexOpen = 0
13f50 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74 73 20 61  ;  /* Prevents a
13f60 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 2e   race condition.
13f70 20 54 69 63 6b 65 74 20 23 33 35 33 37 20 2a 2f   Ticket #3537 */
13f80 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13f90 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
13fa0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
13fb0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
13fc0 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e 52 65 73  ion */.  u8 nRes
13fd0 65 72 76 65 3b 20 20 20 20 20 20 20 20 20 20 20  erve;           
13fe0 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
13ff0 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 20  of unused space 
14000 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
14010 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
14020 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b 20  zDbHeader[100]; 
14030 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
14040 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a  der content */..
14050 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 65    /* True if ope
14060 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61  ning an ephemera
14070 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  l, temporary dat
14080 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
14090 20 69 6e 74 20 69 73 54 65 6d 70 44 62 20 3d 20   int isTempDb = 
140a0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
140b0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30 3b  zFilename[0]==0;
140c0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
140d0 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
140e0 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
140f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
14100 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
14110 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
14120 65 64 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ed database..  *
14130 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
14140 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
14150 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
14160 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 20 20 63  b = 0;.#else.  c
14170 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62  onst int isMemdb
14180 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65 20 26 26   = (zFilename &&
14190 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
141a0 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d  e, ":memory:")==
141b0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
141c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73            || (is
141d0 54 65 6d 70 44 62 20 26 26 20 73 71 6c 69 74 65  TempDb && sqlite
141e0 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64 62  3TempInMemory(db
141f0 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
14200 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 76 66            || (vf
14210 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
14220 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21 3d 30 3b  OPEN_MEMORY)!=0;
14230 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
14240 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
14250 73 65 72 74 28 20 70 56 66 73 21 3d 30 20 29 3b  sert( pVfs!=0 );
14260 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14270 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
14280 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
14290 73 65 72 74 28 20 28 66 6c 61 67 73 26 30 78 66  sert( (flags&0xf
142a0 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20 20 20 2f  f)==flags );   /
142b0 2a 20 66 6c 61 67 73 20 66 69 74 20 69 6e 20 38  * flags fit in 8
142c0 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   bits */..  /* O
142d0 6e 6c 79 20 61 20 42 54 52 45 45 5f 53 49 4e 47  nly a BTREE_SING
142e0 4c 45 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  LE database can 
142f0 62 65 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52  be BTREE_UNORDER
14300 45 44 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ED */.  assert( 
14310 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 55  (flags & BTREE_U
14320 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20 7c 7c 20  NORDERED)==0 || 
14330 28 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53  (flags & BTREE_S
14340 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a 0a 20 20  INGLE)!=0 );..  
14350 2f 2a 20 41 20 42 54 52 45 45 5f 53 49 4e 47 4c  /* A BTREE_SINGL
14360 45 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  E database is al
14370 77 61 79 73 20 61 20 74 65 6d 70 6f 72 61 72 79  ways a temporary
14380 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d 65 72 61   and/or ephemera
14390 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
143a0 66 6c 61 67 73 20 26 20 42 54 52 45 45 5f 53 49  flags & BTREE_SI
143b0 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69 73 54 65  NGLE)==0 || isTe
143c0 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66 28 20 69  mpDb );..  if( i
143d0 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 66 6c  sMemdb ){.    fl
143e0 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4d 45 4d  ags |= BTREE_MEM
143f0 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  ORY;.  }.  if( (
14400 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
14410 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 21  E_OPEN_MAIN_DB)!
14420 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 20 7c  =0 && (isMemdb |
14430 7c 20 69 73 54 65 6d 70 44 62 29 20 29 7b 0a 20  | isTempDb) ){. 
14440 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76     vfsFlags = (v
14450 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54  fsFlags & ~SQLIT
14460 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
14470 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  | SQLITE_OPEN_TE
14480 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 70 20 3d  MP_DB;.  }.  p =
14490 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
144a0 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
144b0 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
144c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
144d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
144e0 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20  .  p->inTrans = 
144f0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d  TRANS_NONE;.  p-
14500 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65  >db = db;.#ifnde
14510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
14520 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e  ARED_CACHE.  p->
14530 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b  lock.pBtree = p;
14540 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  .  p->lock.iTabl
14550 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 1;.#endif..#
14560 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
14570 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14580 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65  ACHE) && !define
14590 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  d(SQLITE_OMIT_DI
145a0 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  SKIO).  /*.  ** 
145b0 49 66 20 74 68 69 73 20 42 74 72 65 65 20 69 73  If this Btree is
145c0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
145d0 20 73 68 61 72 65 64 20 63 61 63 68 65 2c 20 74   shared cache, t
145e0 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20  ry to find an.  
145f0 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74 53 68  ** existing BtSh
14600 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74  ared object that
14610 20 77 65 20 63 61 6e 20 73 68 61 72 65 20 77 69   we can share wi
14620 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  th.  */.  if( is
14630 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73  TempDb==0 && (is
14640 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73  Memdb==0 || (vfs
14650 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45  Flags&SQLITE_OPE
14660 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20  N_URI)!=0) ){.  
14670 20 20 69 66 28 20 76 66 73 46 6c 61 67 73 20 26    if( vfsFlags &
14680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
14690 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20  REDCACHE ){.    
146a0 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20    int nFilename 
146b0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
146c0 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a  0(zFilename)+1;.
146d0 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50        int nFullP
146e0 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e  athname = pVfs->
146f0 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20  mxPathname+1;.  
14700 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50      char *zFullP
14710 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
14720 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c  3Malloc(MAX(nFul
14730 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e  lPathname,nFilen
14740 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54  ame));.      MUT
14750 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
14760 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68  3_mutex *mutexSh
14770 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70  ared; )..      p
14780 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a  ->sharable = 1;.
14790 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
147a0 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
147b0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
147c0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
147d0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
147e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
147f0 20 20 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62       if( isMemdb
14800 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
14810 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  py(zFullPathname
14820 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69  , zFilename, nFi
14830 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
14840 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
14850 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
14860 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
14870 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 46 75               nFu
148a0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c  llPathname, zFul
148b0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
148c0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
148d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
148e0 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
148f0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  me);.          s
14900 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
14910 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14920 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
14930 20 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54       }.#if SQLIT
14940 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 20  E_THREADSAFE.   
14950 20 20 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73     mutexOpen = s
14960 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
14970 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
14980 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20  ATIC_OPEN);.    
14990 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
149a0 65 6e 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29  enter(mutexOpen)
149b0 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61  ;.      mutexSha
149c0 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
149d0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
149e0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
149f0 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ER);.      sqlit
14a00 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
14a10 75 74 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e  utexShared);.#en
14a20 64 69 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42  dif.      for(pB
14a30 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  t=GLOBAL(BtShare
14a40 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14a50 43 61 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b  CacheList); pBt;
14a60 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29   pBt=pBt->pNext)
14a70 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14a80 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pBt->nRef>0 );
14a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
14aa0 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68  strcmp(zFullPath
14ab0 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67  name, sqlite3Pag
14ac0 65 72 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e  erFilename(pBt->
14ad0 70 50 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20  pPager, 0)).    
14ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14af0 73 71 6c 69 74 65 33 50 61 67 65 72 56 66 73 28  sqlite3PagerVfs(
14b00 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56  pBt->pPager)==pV
14b10 66 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fs ){.          
14b20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20  int iDb;.       
14b30 20 20 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e     for(iDb=db->n
14b40 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44  Db-1; iDb>=0; iD
14b50 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b--){.          
14b60 20 20 42 74 72 65 65 20 2a 70 45 78 69 73 74 69    Btree *pExisti
14b70 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ng = db->aDb[iDb
14b80 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  ].pBt;.         
14b90 20 20 20 69 66 28 20 70 45 78 69 73 74 69 6e 67     if( pExisting
14ba0 20 26 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70   && pExisting->p
14bb0 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20  Bt==pBt ){.     
14bc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14bd0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14be0 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
14bf0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14c00 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14c10 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20  exOpen);.       
14c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
14c30 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
14c40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
14c50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14c60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
14c70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14c80 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20  ONSTRAINT;.     
14c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14ca0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14cb0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20  ->pBt = pBt;.   
14cc0 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66         pBt->nRef
14cd0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ++;.          br
14ce0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
14cf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14d00 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14d10 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
14d20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14d30 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
14d40 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
14d50 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
14d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
14d70 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65  n debug mode, we
14d80 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73   mark all persis
14d90 74 65 6e 74 20 64 61 74 61 62 61 73 65 73 20 61  tent databases a
14da0 73 20 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20  s sharable.     
14db0 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68   ** even when th
14dc0 65 79 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69  ey are not.  Thi
14dd0 73 20 65 78 65 72 63 69 73 65 73 20 74 68 65 20  s exercises the 
14de0 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64  locking code and
14df0 0a 20 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20  .      ** gives 
14e00 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79  more opportunity
14e10 20 66 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c   for asserts(sql
14e20 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
14e30 29 29 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  )).      ** stat
14e40 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c  ements to find l
14e50 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e  ocking problems.
14e60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
14e70 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b  p->sharable = 1;
14e80 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14e90 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  }.#endif.  if( p
14ea0 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a  Bt==0 ){.    /*.
14eb0 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f      ** The follo
14ec0 77 69 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b  wing asserts mak
14ed0 65 20 73 75 72 65 20 74 68 61 74 20 73 74 72 75  e sure that stru
14ee0 63 74 75 72 65 73 20 75 73 65 64 20 62 79 20 74  ctures used by t
14ef0 68 65 20 62 74 72 65 65 20 61 72 65 0a 20 20 20  he btree are.   
14f00 20 2a 2a 20 74 68 65 20 72 69 67 68 74 20 73 69   ** the right si
14f10 7a 65 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20  ze.  This is to 
14f20 67 75 61 72 64 20 61 67 61 69 6e 73 74 20 73 69  guard against si
14f30 7a 65 20 63 68 61 6e 67 65 73 20 74 68 61 74 20  ze changes that 
14f40 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68  result.    ** wh
14f50 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20  en compiling on 
14f60 61 20 64 69 66 66 65 72 65 6e 74 20 61 72 63 68  a different arch
14f70 69 74 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f  itecture..    */
14f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
14f90 65 6f 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20  eof(i64)==8 );. 
14fa0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
14fb0 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(u64)==8 );.   
14fc0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14fd0 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u32)==4 );.    a
14fe0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31  ssert( sizeof(u1
14ff0 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73  6)==2 );.    ass
15000 65 72 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f  ert( sizeof(Pgno
15010 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70  )==4 );.  .    p
15020 42 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  Bt = sqlite3Mall
15030 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
15040 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
15050 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
15060 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15070 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  M_BKPT;.      go
15080 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  to btree_open_ou
15090 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
150a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
150b0 65 6e 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70  en(pVfs, &pBt->p
150c0 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65  Pager, zFilename
150d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
150e0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
150f0 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20 66 6c 61  of(MemPage), fla
15100 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61  gs, vfsFlags, pa
15110 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69  geReinit);.    i
15120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15140 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d  3PagerSetMmapLim
15150 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  it(pBt->pPager, 
15160 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20  db->szMmap);.   
15170 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15180 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
15190 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73  er(pBt->pPager,s
151a0 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29  izeof(zDbHeader)
151b0 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20  ,zDbHeader);.   
151c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
151d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
151e0 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
151f0 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
15200 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20   pBt->openFlags 
15210 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20  = (u8)flags;.   
15220 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20   pBt->db = db;. 
15230 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
15240 65 74 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  etBusyHandler(pB
15250 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65  t->pPager, btree
15260 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
15270 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e  r, pBt);.    p->
15280 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20  pBt = pBt;.  .  
15290 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
152a0 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
152b0 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ge1 = 0;.    if(
152c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72   sqlite3PagerIsr
152d0 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61  eadonly(pBt->pPa
152e0 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46  ger) ) pBt->btsF
152f0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
15300 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65 66 69 6e  _ONLY;.#if defin
15310 65 64 28 53 51 4c 49 54 45 5f 53 45 43 55 52 45  ed(SQLITE_SECURE
15320 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42 74  _DELETE).    pBt
15330 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
15340 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
15350 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
15360 51 4c 49 54 45 5f 46 41 53 54 5f 53 45 43 55 52  QLITE_FAST_SECUR
15370 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20 70 42  E_DELETE).    pB
15380 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15390 54 53 5f 4f 56 45 52 57 52 49 54 45 3b 0a 23 65  TS_OVERWRITE;.#e
153a0 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44  ndif.    /* EVID
153b0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
153c0 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
153d0 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
153e0 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
153f0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
15400 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
15410 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
15420 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
15430 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
15440 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
15450 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15460 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d  ile. */.    pBt-
15470 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
15480 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
15490 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
154a0 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
154b0 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
154c0 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
154d0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
154e0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
154f0 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
15500 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
15510 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
15520 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
15530 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
15540 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15550 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
15560 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
15570 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
15580 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
15590 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
155a0 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
155b0 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
155c0 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
155d0 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
155e0 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
155f0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
15600 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
15610 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
15620 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
15630 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
15640 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
15650 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
15660 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
15670 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
15680 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
15690 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
156a0 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
156b0 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
156c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
156d0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
156e0 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
156f0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
15700 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
15710 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
15720 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
15730 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
15740 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
15750 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
15760 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
15770 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
15780 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
15790 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
157a0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
157b0 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
157c0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
157d0 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
157e0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74   is.      ** det
157f0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
15800 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
15810 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
15820 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
15830 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  0.      ** into 
15840 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
15850 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
15860 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
15870 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
15880 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
15890 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
158a0 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
158b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
158c0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
158d0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
158e0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
158f0 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
15900 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
15910 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
15920 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
15930 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
15940 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
15950 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15960 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
15970 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
15980 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
15990 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
159a0 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
159b0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
159c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
159d0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
159e0 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
159f0 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
15a00 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
15a10 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
15a20 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
15a30 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
15a40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15a50 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
15a60 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15a70 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15a80 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
15a90 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
15aa0 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
15ab0 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
15ac0 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
15ad0 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d  .    pBt->nRef =
15ae0 20 31 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   1;.    if( p->s
15af0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
15b00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
15b10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
15b20 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
15b30 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d    MUTEX_LOGIC( m
15b40 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
15b50 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
15b60 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
15b70 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20  IC_MASTER);).   
15b80 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
15b90 52 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69  READSAFE && sqli
15ba0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15bb0 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
15bc0 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78        pBt->mutex
15bd0 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
15be0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
15bf0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20  X_FAST);.       
15c00 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d   if( pBt->mutex=
15c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
15c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
15c30 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
15c40 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
15c50 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  n_out;.        }
15c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
15c70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15c80 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
15c90 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78  .      pBt->pNex
15ca0 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
15cb0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15cc0 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
15cd0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
15ce0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
15cf0 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
15d00 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  Bt;.      sqlite
15d10 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
15d20 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
15d30 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69  }.#endif.  }..#i
15d40 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
15d50 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15d60 43 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  CHE) && !defined
15d70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53  (SQLITE_OMIT_DIS
15d80 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65  KIO).  /* If the
15d90 20 6e 65 77 20 42 74 72 65 65 20 75 73 65 73 20   new Btree uses 
15da0 61 20 73 68 61 72 61 62 6c 65 20 70 42 74 53 68  a sharable pBtSh
15db0 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20  ared, then link 
15dc0 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72  the new.  ** Btr
15dd0 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  ee into the list
15de0 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65   of all sharable
15df0 20 42 74 72 65 65 73 20 66 6f 72 20 74 68 65 20   Btrees for the 
15e00 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  same connection.
15e10 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69  .  ** The list i
15e20 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64  s kept in ascend
15e30 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 42 74  ing order by pBt
15e40 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20   address..  */. 
15e50 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
15e60 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
15e70 20 20 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a     Btree *pSib;.
15e80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
15e90 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
15ea0 20 20 20 20 69 66 28 20 28 70 53 69 62 20 3d 20      if( (pSib = 
15eb0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21  db->aDb[i].pBt)!
15ec0 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72  =0 && pSib->shar
15ed0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  able ){.        
15ee0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72  while( pSib->pPr
15ef0 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69  ev ){ pSib = pSi
15f00 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20  b->pPrev; }.    
15f10 20 20 20 20 69 66 28 20 28 75 70 74 72 29 70 2d      if( (uptr)p-
15f20 3e 70 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d  >pBt<(uptr)pSib-
15f30 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  >pBt ){.        
15f40 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
15f50 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  b;.          p->
15f60 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20  pPrev = 0;.     
15f70 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76       pSib->pPrev
15f80 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65   = p;.        }e
15f90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
15fa0 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78  hile( pSib->pNex
15fb0 74 20 26 26 20 28 75 70 74 72 29 70 53 69 62 2d  t && (uptr)pSib-
15fc0 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74  >pNext->pBt<(upt
15fd0 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  r)p->pBt ){.    
15fe0 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20 70          pSib = p
15ff0 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
16000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16010 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69    p->pNext = pSi
16020 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
16030 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70      p->pPrev = p
16040 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Sib;.          i
16050 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
16060 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e             p->pN
16070 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a  ext->pPrev = p;.
16080 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16090 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78        pSib->pNex
160a0 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  t = p;.        }
160b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
160c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
160d0 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74  }.#endif.  *ppBt
160e0 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f  ree = p;..btree_
160f0 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20  open_out:.  if( 
16100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16110 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20  .    if( pBt && 
16120 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20  pBt->pPager ){. 
16130 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
16140 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
16150 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
16160 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16170 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
16180 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70  _free(p);.    *p
16190 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  pBtree = 0;.  }e
161a0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
161b0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20  _file *pFile;.. 
161c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
161d0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
161e0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
161f0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
16200 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
16210 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
16220 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
16230 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
16240 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
16250 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
16260 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
16270 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
16280 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
16290 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
162a0 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
162b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
162c0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
162d0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
162e0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
162f0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
16300 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69  ;.    }..    pFi
16310 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  le = sqlite3Page
16320 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
16330 72 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  r);.    if( pFil
16340 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
16350 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69       sqlite3OsFi
16360 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46  leControlHint(pF
16370 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ile, SQLITE_FCNT
16380 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70  L_PDB, (void*)&p
16390 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20  Bt->db);.    }. 
163a0 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70   }.  if( mutexOp
163b0 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
163c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
163d0 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20  held(mutexOpen) 
163e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
163f0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
16400 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73  Open);.  }.  ass
16410 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
16420 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  OK || sqlite3Btr
16430 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e  eeConnectionCoun
16440 74 28 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b  t(*ppBtree)>0 );
16450 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16460 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74  ./*.** Decrement
16470 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
16480 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65  ef counter.  Whe
16490 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a 65 72  n it reaches zer
164a0 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65  o,.** remove the
164b0 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
164c0 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61  ure from the sha
164d0 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75  ring list.  Retu
164e0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68  rn.** true if th
164f0 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20  e BtShared.nRef 
16500 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65 73 20  counter reaches 
16510 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a  zero and return.
16520 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ** false if it i
16530 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65  s still positive
16540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16550 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
16560 67 4c 69 73 74 28 42 74 53 68 61 72 65 64 20 2a  gList(BtShared *
16570 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  pBt){.#ifndef SQ
16580 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16590 5f 43 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c  _CACHE.  MUTEX_L
165a0 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75  OGIC( sqlite3_mu
165b0 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a  tex *pMaster; ).
165c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73    BtShared *pLis
165d0 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64  t;.  int removed
165e0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
165f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e   sqlite3_mutex_n
16600 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  otheld(pBt->mute
16610 78 29 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  x) );.  MUTEX_LO
16620 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
16630 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
16640 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
16650 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
16660 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16670 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
16680 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
16690 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
166a0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
166b0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
166c0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
166d0 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
166e0 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
166f0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
16700 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
16710 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
16720 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
16730 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
16740 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
16750 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
16760 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
16770 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
16780 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
16790 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
167a0 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
167b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
167c0 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
167d0 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
167e0 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
167f0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
16800 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
16810 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
16820 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
16830 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
16840 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
16850 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
16860 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16870 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
16880 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
16890 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
168a0 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
168b0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
168c0 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
168d0 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
168e0 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
168f0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
16900 65 73 20 77 69 74 68 20 61 20 34 2d 62 79 74 65  es with a 4-byte
16910 20 70 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65   prefix for a le
16920 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e  ft-child.** poin
16930 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
16940 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70  oid allocateTemp
16950 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
16960 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74  pBt){.  if( !pBt
16970 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20  ->pTmpSpace ){. 
16980 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
16990 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  e = sqlite3PageM
169a0 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65  alloc( pBt->page
169b0 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
169c0 4f 6e 65 20 6f 66 20 74 68 65 20 75 73 65 73 20  One of the uses 
169d0 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  of pBt->pTmpSpac
169e0 65 20 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63  e is to format c
169f0 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20  ells before.    
16a00 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  ** inserting the
16a10 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61  m into a leaf pa
16a20 67 65 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c  ge (function fil
16a30 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20  lInCell()). If. 
16a40 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20     ** a cell is 
16a50 6c 65 73 73 20 74 68 61 6e 20 34 20 62 79 74 65  less than 4 byte
16a60 73 20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73  s in size, it is
16a70 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
16a80 20 62 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79   bytes.    ** by
16a90 20 74 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75   the various rou
16aa0 74 69 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70  tines that manip
16ab0 75 6c 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c  ulate binary cel
16ac0 6c 73 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a  ls. Which.    **
16ad0 20 63 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66   can mean that f
16ae0 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
16af0 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65   initializes the
16b00 20 66 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20   first 2 or 3.  
16b10 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54    ** bytes of pT
16b20 6d 70 53 70 61 63 65 2c 20 62 75 74 20 74 68 61  mpSpace, but tha
16b30 74 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  t the first 4 by
16b40 74 65 73 20 61 72 65 20 63 6f 70 69 65 64 20 66  tes are copied f
16b50 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e  rom.    ** it in
16b60 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 70 61  to a database pa
16b70 67 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  ge. This is not 
16b80 61 63 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c  actually a probl
16b90 65 6d 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a  em, but it.    *
16ba0 2a 20 64 6f 65 73 20 63 61 75 73 65 20 61 20 76  * does cause a v
16bb0 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68  algrind error wh
16bc0 65 6e 20 74 68 65 20 31 20 6f 72 20 32 20 62 79  en the 1 or 2 by
16bd0 74 65 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a  tes of unitializ
16be0 65 64 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20  ed .    ** data 
16bf0 69 73 20 70 61 73 73 65 64 20 74 6f 20 73 79 73  is passed to sys
16c00 74 65 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29  tem call write()
16c10 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68  . So to avoid th
16c20 69 73 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a  is error,.    **
16c30 20 7a 65 72 6f 20 74 68 65 20 66 69 72 73 74 20   zero the first 
16c40 34 20 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20  4 bytes of temp 
16c50 73 70 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20  space here..    
16c60 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20  **.    ** Also: 
16c70 20 50 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79   Provide four by
16c80 74 65 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a  tes of initializ
16c90 65 64 20 73 70 61 63 65 20 62 65 66 6f 72 65 20  ed space before 
16ca0 74 68 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e  the.    ** begin
16cb0 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63  ning of pTmpSpac
16cc0 65 20 61 73 20 61 6e 20 61 72 65 61 20 61 76 61  e as an area ava
16cd0 69 6c 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e  ilable to prepen
16ce0 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66  d the.    ** lef
16cf0 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20  t-child pointer 
16d00 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
16d10 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20   of a cell..    
16d20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  */.    if( pBt->
16d30 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
16d40 20 20 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70     memset(pBt->p
16d50 54 6d 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b  TmpSpace, 0, 8);
16d60 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  .      pBt->pTmp
16d70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20  Space += 4;.    
16d80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
16d90 72 65 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d  ree the pBt->pTm
16da0 70 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f  pSpace allocatio
16db0 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
16dc0 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 42   freeTempSpace(B
16dd0 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16de0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
16df0 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ace ){.    pBt->
16e00 70 54 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a  pTmpSpace -= 4;.
16e10 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
16e20 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61  ree(pBt->pTmpSpa
16e30 63 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54  ce);.    pBt->pT
16e40 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d  mpSpace = 0;.  }
16e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
16e60 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
16e70 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
16e80 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
16e90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ea0 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
16eb0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
16ec0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
16ed0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
16ee0 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
16ef0 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
16f00 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
16f10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16f20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
16f30 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
16f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16f50 65 72 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20  er(p);.  pCur = 
16f60 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
16f70 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
16f80 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
16f90 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
16fa0 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
16fb0 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
16fc0 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
16fd0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
16fe0 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
16ff0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
17000 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
17010 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
17020 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
17030 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
17040 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
17050 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
17060 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
17070 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
17080 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
17090 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
170a0 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
170b0 62 61 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f  back(p, SQLITE_O
170c0 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
170d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
170e0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
170f0 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
17100 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
17110 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
17120 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
17130 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
17140 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
17150 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
17160 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
17170 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
17180 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
17190 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
171a0 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
171b0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
171c0 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
171d0 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
171e0 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
171f0 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
17200 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
17210 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
17220 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
17230 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
17240 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
17250 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
17260 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
17270 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
17280 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
17290 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
172a0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
172b0 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
172c0 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
172d0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
172e0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
172f0 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
17300 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
17310 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
17320 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
17330 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
17340 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
17350 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
17360 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
17370 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
17380 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
17390 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
173a0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
173b0 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
173c0 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
173d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
173e0 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
173f0 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
17400 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
17410 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
17420 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
17430 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
17440 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
17450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
17460 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17470 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
17480 61 6e 67 65 20 74 68 65 20 22 73 6f 66 74 22 20  ange the "soft" 
17490 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
174a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
174b0 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e  the cache..** Un
174c0 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66  used and unmodif
174d0 69 65 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62  ied pages will b
174e0 65 20 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20  e recycled when 
174f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
17500 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
17510 63 68 65 20 65 78 63 65 65 64 73 20 74 68 69 73  che exceeds this
17520 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75   soft limit.  Bu
17530 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
17540 65 0a 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c  e.** cache is al
17550 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61  lowed to grow la
17560 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c  rger than this l
17570 69 6d 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61  imit if it conta
17580 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67  ins.** dirty pag
17590 65 73 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c  es or pages stil
175a0 6c 20 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e  l in active use.
175b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
175c0 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a 65  treeSetCacheSize
175d0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
175e0 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72  xPage){.  BtShar
175f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17600 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17610 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17620 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
17630 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17640 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
17650 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69  3PagerSetCachesi
17660 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17670 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
17680 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
176a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
176b0 61 6e 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22  ange the "spill"
176c0 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75   limit on the nu
176d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
176e0 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49   the cache..** I
176f0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
17700 70 61 67 65 73 20 65 78 63 65 65 64 73 20 74 68  pages exceeds th
17710 69 73 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20  is limit during 
17720 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  a write transact
17730 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65  ion,.** the page
17740 72 20 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20  r might attempt 
17750 74 6f 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73  to "spill" pages
17760 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
17770 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65  early in.** orde
17780 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
17790 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ory..**.** The v
177a0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
177b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69   the current spi
177c0 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72  ll size.  If zer
177d0 6f 20 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61  o is passed.** a
177e0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e  s an argument, n
177f0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
17800 64 65 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20  de to the spill 
17810 73 69 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f  size setting, so
17820 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65  .** using mxPage
17830 20 6f 66 20 30 20 69 73 20 61 20 77 61 79 20 74   of 0 is a way t
17840 6f 20 71 75 65 72 79 20 74 68 65 20 63 75 72 72  o query the curr
17850 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a  ent spill size..
17860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17870 72 65 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28  reeSetSpillSize(
17880 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78  Btree *p, int mx
17890 50 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Page){.  BtShare
178a0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
178b0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73  .  int res;.  as
178c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
178d0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
178e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
178f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17900 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ;.  res = sqlite
17910 33 50 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69  3PagerSetSpillsi
17920 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17930 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74  mxPage);.  sqlit
17940 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17950 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
17960 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
17970 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
17980 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
17990 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e  mit on the amoun
179a0 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
179b0 65 20 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20  e file that may 
179c0 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70  be.** memory map
179d0 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ped..*/.int sqli
179e0 74 65 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c  te3BtreeSetMmapL
179f0 69 6d 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73  imit(Btree *p, s
17a00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d  qlite3_int64 szM
17a10 6d 61 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64  map){.  BtShared
17a20 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
17a30 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17a40 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
17a50 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
17a60 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17a70 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
17a80 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74  agerSetMmapLimit
17a90 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a  (pBt->pPager, sz
17aa0 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  Mmap);.  sqlite3
17ab0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17ac0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17ad0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
17ae0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
17af0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
17b00 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20 64  Change the way d
17b10 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f  ata is synced to
17b20 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74   disk in order t
17b30 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65  o increase or de
17b40 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65  crease.** how we
17b50 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ll the database 
17b60 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20 64  resists damage d
17b70 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
17b80 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61   and power.** fa
17b90 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31  ilures.  Level 1
17ba0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
17bb0 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f  asynchronous (no
17bc0 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61   syncs() occur a
17bd0 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61  nd.** there is a
17be0 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
17bf0 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65  y of damage)  Le
17c00 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65 66  vel 2 is the def
17c10 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ault.  There.** 
17c20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75  is a very low bu
17c30 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61  t non-zero proba
17c40 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
17c50 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63  .  Level 3 reduc
17c60 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62  es the.** probab
17c70 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20  ility of damage 
17c80 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74  to near zero but
17c90 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70 65   with a write pe
17ca0 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74  rformance reduct
17cb0 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ion..*/.#ifndef 
17cc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
17cd0 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71  R_PRAGMAS.int sq
17ce0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
17cf0 65 72 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65  erFlags(.  Btree
17d00 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
17d10 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74    /* The btree t
17d20 6f 20 73 65 74 20 74 68 65 20 73 61 66 65 74 79  o set the safety
17d30 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75   level on */.  u
17d40 6e 73 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20  nsigned pgFlags 
17d50 20 20 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73        /* Various
17d60 20 50 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a   PAGER_* flags *
17d70 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
17d80 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
17d90 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17da0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
17db0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
17dc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
17dd0 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
17de0 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d  gerSetFlags(pBt-
17df0 3e 70 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73  >pPager, pgFlags
17e00 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17e10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
17e20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17e30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
17e40 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c  hange the defaul
17e50 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64  t pages size and
17e60 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
17e70 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70 65  eserved bytes pe
17e80 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69  r page..** Or, i
17e90 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
17ea0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17eb0 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53   fixed, return S
17ec0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a  QLITE_READONLY .
17ed0 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ** without chang
17ee0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a  ing anything..**
17ef0 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
17f00 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
17f10 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
17f20 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
17f30 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
17f40 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
17f50 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
17f60 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
17f70 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
17f80 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
17f90 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
17fa0 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
17fb0 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
17fc0 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
17fd0 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
17fe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17ff0 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
18000 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
18010 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
18020 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
18030 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
18040 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
18050 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
18060 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
18070 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
18080 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
18090 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
180a0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
180b0 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
180c0 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
180d0 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
180e0 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
180f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46  .**.** If the iF
18100 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42  ix!=0 then the B
18110 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
18120 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f  D flag is set so
18130 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 73   that the page s
18140 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76  ize.** and autov
18150 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e  acuum mode can n
18160 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e  o longer be chan
18170 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
18180 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
18190 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
181a0 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20  t pageSize, int 
181b0 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46  nReserve, int iF
181c0 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ix){.  int rc = 
181d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
181e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
181f0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  pBt;.  assert( n
18200 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e  Reserve>=-1 && n
18210 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
18220 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
18230 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49  ter(p);.#if SQLI
18240 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69  TE_HAS_CODEC.  i
18250 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d  f( nReserve>pBt-
18260 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20  >optimalReserve 
18270 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ) pBt->optimalRe
18280 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73  serve = (u8)nRes
18290 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69  erve;.#endif.  i
182a0 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
182b0 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f   & BTS_PAGESIZE_
182c0 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  FIXED ){.    sql
182d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
182e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
182f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
18300 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76   }.  if( nReserv
18310 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65  e<0 ){.    nRese
18320 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53  rve = pBt->pageS
18330 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
18340 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73  eSize;.  }.  ass
18350 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30  ert( nReserve>=0
18360 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35   && nReserve<=25
18370 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53  5 );.  if( pageS
18380 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
18390 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
183a0 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20  _PAGE_SIZE &&.  
183b0 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a 65        ((pageSize
183c0 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30  -1)&pageSize)==0
183d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
183e0 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
183f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18400 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
18410 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
18420 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65 53  ize = (u32)pageS
18430 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d  ize;.    freeTem
18440 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d  pSpace(pBt);.  }
18450 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
18460 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
18470 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
18480 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65  t->pageSize, nRe
18490 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75  serve);.  pBt->u
184a0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
184b0 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36  >pageSize - (u16
184c0 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28  )nReserve;.  if(
184d0 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73   iFix ) pBt->bts
184e0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
184f0 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73  ESIZE_FIXED;.  s
18500 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18510 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18520 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
18530 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  n the currently 
18540 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a  defined page siz
18550 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  e.*/.int sqlite3
18560 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65  BtreeGetPageSize
18570 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65  (Btree *p){.  re
18580 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67  turn p->pBt->pag
18590 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eSize;.}../*.** 
185a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
185b0 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
185c0 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
185d0 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  ve(), except tha
185e0 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79  t it.** may only
185f0 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74   be called if it
18600 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
18610 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d  hat the b-tree m
18620 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a  utex is already.
18630 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54  ** held..**.** T
18640 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e  his is useful in
18650 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73   one special cas
18660 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20  e in the backup 
18670 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20 69  API code where i
18680 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68  t is.** known th
18690 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62 2d  at the shared b-
186a0 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65  tree mutex is he
186b0 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65  ld, but the mute
186c0 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  x on the .** dat
186d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61  abase handle tha
186e0 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74  t owns *p is not
186f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
18700 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e  f sqlite3BtreeEn
18710 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f  ter().** were to
18720 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d   be called, it m
18730 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74  ight collide wit
18740 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65  h some other ope
18750 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a  ration on the.**
18760 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
18770 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20 63   that owns *p, c
18780 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64  ausing undefined
18790 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e   behavior..*/.in
187a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
187b0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
187c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
187d0 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   n;.  assert( sq
187e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
187f0 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  (p->pBt->mutex) 
18800 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  );.  n = p->pBt-
18810 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70  >pageSize - p->p
18820 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
18830 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
18840 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18850 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18860 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
18870 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  end of every pag
18880 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e  e that.** are in
18890 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75  tentually left u
188a0 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73 20  nused.  This is 
188b0 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20 73  the "reserved" s
188c0 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20  pace that is.** 
188d0 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62  sometimes used b
188e0 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a  y extensions..**
188f0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41  .** If SQLITE_HA
18900 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e  S_MUTEX is defin
18910 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  ed then the numb
18920 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  er returned is t
18930 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66  he.** greater of
18940 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
18950 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64 20  erved space and 
18960 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75  the maximum requ
18970 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65  ested.** reserve
18980 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73   space..*/.int s
18990 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f 70  qlite3BtreeGetOp
189a0 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72  timalReserve(Btr
189b0 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b  ee *p){.  int n;
189c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
189d0 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
189e0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
189f0 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b  serveNoMutex(p);
18a00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18a10 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e  AS_CODEC.  if( n
18a20 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  <p->pBt->optimal
18a30 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d  Reserve ) n = p-
18a40 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73  >pBt->optimalRes
18a50 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73  erve;.#endif.  s
18a60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18a70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
18a80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  .}.../*.** Set t
18a90 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18aa0 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61  count for a data
18ab0 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20 69  base if mxPage i
18ac0 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e  s positive..** N
18ad0 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61  o changes are ma
18ae0 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  de if mxPage is 
18af0 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a  0 or negative..*
18b00 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
18b10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50  the value of mxP
18b20 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20  age, return the 
18b30 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
18b40 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
18b50 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f  e3BtreeMaxPageCo
18b60 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  unt(Btree *p, in
18b70 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74  t mxPage){.  int
18b80 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
18b90 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
18ba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61  = sqlite3PagerMa
18bb0 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42  xPageCount(p->pB
18bc0 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
18bd0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
18be0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
18bf0 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
18c00 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
18c10 65 73 20 66 6f 72 20 74 68 65 20 42 54 53 5f 53  es for the BTS_S
18c20 45 43 55 52 45 5f 44 45 4c 45 54 45 20 61 6e 64  ECURE_DELETE and
18c30 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 66   BTS_OVERWRITE f
18c40 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 6e  lags:.**.**    n
18c50 65 77 46 6c 61 67 3d 3d 30 20 20 20 20 20 20 20  ewFlag==0       
18c60 42 6f 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f  Both BTS_SECURE_
18c70 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f  DELETE and BTS_O
18c80 56 45 52 57 52 49 54 45 20 61 72 65 20 63 6c 65  VERWRITE are cle
18c90 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c  ared.**    newFl
18ca0 61 67 3d 3d 31 20 20 20 20 20 20 20 42 54 53 5f  ag==1       BTS_
18cb0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 73 65  SECURE_DELETE se
18cc0 74 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  t and BTS_OVERWR
18cd0 49 54 45 20 69 73 20 63 6c 65 61 72 65 64 0a 2a  ITE is cleared.*
18ce0 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 32 20  *    newFlag==2 
18cf0 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45        BTS_SECURE
18d00 5f 44 45 4c 45 54 45 20 63 6c 65 61 72 65 64 20  _DELETE cleared 
18d10 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18d20 45 20 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 6e  E is set.**    n
18d30 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20 20 20 20  ewFlag==(-1)    
18d40 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a 0a 2a 2a  No changes.**.**
18d50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
18d60 74 73 20 61 73 20 61 20 71 75 65 72 79 20 69 66  ts as a query if
18d70 20 6e 65 77 46 6c 61 67 20 69 73 20 6c 65 73 73   newFlag is less
18d80 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a   than zero.**.**
18d90 20 57 69 74 68 20 42 54 53 5f 4f 56 45 52 57 52   With BTS_OVERWR
18da0 49 54 45 20 73 65 74 2c 20 64 65 6c 65 74 65 64  ITE set, deleted
18db0 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f 76 65 72   content is over
18dc0 77 72 69 74 74 65 6e 20 62 79 20 7a 65 72 6f 73  written by zeros
18dd0 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65 6c 69 73  , but.** freelis
18de0 74 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65  t leaf pages are
18df0 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 62 61 63   not written bac
18e00 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
18e10 65 2e 20 20 54 68 75 73 20 69 6e 2d 70 61 67 65  e.  Thus in-page
18e20 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  .** deleted cont
18e30 65 6e 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20  ent is cleared, 
18e40 62 75 74 20 66 72 65 65 6c 69 73 74 20 64 65 6c  but freelist del
18e50 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
18e60 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20  not..**.** With 
18e70 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18e80 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  E, operation is 
18e90 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52 57 52 49  like BTS_OVERWRI
18ea0 54 45 20 77 69 74 68 20 74 68 65 20 61 64 64 69  TE with the addi
18eb0 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 66 72 65  tion.** that fre
18ec0 65 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  elist leaf pages
18ed0 20 61 72 65 20 77 72 69 74 74 65 6e 20 62 61 63   are written bac
18ee0 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  k into the datab
18ef0 61 73 65 2c 20 69 6e 63 72 65 61 73 69 6e 67 0a  ase, increasing.
18f00 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ** the amount of
18f10 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e   disk I/O..*/.in
18f20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
18f30 63 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65  cureDelete(Btree
18f40 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67   *p, int newFlag
18f50 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66  ){.  int b;.  if
18f60 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
18f70 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  0;.  sqlite3Btre
18f80 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
18f90 65 72 74 28 20 42 54 53 5f 4f 56 45 52 57 52 49  ert( BTS_OVERWRI
18fa0 54 45 3d 3d 42 54 53 5f 53 45 43 55 52 45 5f 44  TE==BTS_SECURE_D
18fb0 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20 61 73 73  ELETE*2 );.  ass
18fc0 65 72 74 28 20 42 54 53 5f 46 41 53 54 5f 53 45  ert( BTS_FAST_SE
18fd0 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56 45 52 57  CURE==(BTS_OVERW
18fe0 52 49 54 45 7c 42 54 53 5f 53 45 43 55 52 45 5f  RITE|BTS_SECURE_
18ff0 44 45 4c 45 54 45 29 20 29 3b 0a 20 20 69 66 28  DELETE) );.  if(
19000 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20   newFlag>=0 ){. 
19010 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c     p->pBt->btsFl
19020 61 67 73 20 26 3d 20 7e 42 54 53 5f 46 41 53 54  ags &= ~BTS_FAST
19030 5f 53 45 43 55 52 45 3b 0a 20 20 20 20 70 2d 3e  _SECURE;.    p->
19040 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
19050 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
19060 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20 20 7d 0a  TE*newFlag;.  }.
19070 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
19080 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46 41  tsFlags & BTS_FA
19090 53 54 5f 53 45 43 55 52 45 29 2f 42 54 53 5f 53  ST_SECURE)/BTS_S
190a0 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20  ECURE_DELETE;.  
190b0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
190c0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
190d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
190e0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
190f0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
19100 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
19110 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
19120 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
19130 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
19140 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
19150 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
19160 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
19170 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
19180 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
19190 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
191a0 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
191b0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
191c0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
191d0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
191e0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
191f0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
19200 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
19210 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
19220 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19230 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
19240 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
19250 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
19260 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
19270 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
19280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
19290 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
192a0 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
192b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
192c0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
192d0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
192e0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
192f0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
19300 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
19310 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
19320 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
19330 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
19340 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
19350 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
19360 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
19370 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
19380 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
19390 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
193a0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
193b0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
193c0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
193d0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
193e0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
193f0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
19400 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
19410 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
19420 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
19430 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
19440 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
19450 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19460 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
19470 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
19480 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
19490 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
194a0 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
194b0 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
194c0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
194d0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
194e0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
194f0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
19500 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
19510 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
19520 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
19530 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19540 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19550 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
19560 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 75 73  ./*.** If the us
19570 65 72 20 68 61 73 20 6e 6f 74 20 73 65 74 20 74  er has not set t
19580 68 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20  he safety-level 
19590 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
195a0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
195b0 75 73 69 6e 67 20 22 50 52 41 47 4d 41 20 73 79  using "PRAGMA sy
195c0 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61 6e 64 20  nchronous", and 
195d0 69 66 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65  if the safety-le
195e0 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  vel is not alrea
195f0 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65  dy.** set to the
19600 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 74 6f   value passed to
19610 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
19620 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
19630 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65 74 20 69  ameter,.** set i
19640 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  t so..*/.#if SQL
19650 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
19660 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f  HRONOUS!=SQLITE_
19670 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
19680 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20 20 26 26  HRONOUS \.    &&
19690 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
196a0 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74 61 74 69  _OMIT_WAL).stati
196b0 63 20 76 6f 69 64 20 73 65 74 44 65 66 61 75 6c  c void setDefaul
196c0 74 53 79 6e 63 46 6c 61 67 28 42 74 53 68 61 72  tSyncFlag(BtShar
196d0 65 64 20 2a 70 42 74 2c 20 75 38 20 73 61 66 65  ed *pBt, u8 safe
196e0 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20 73 71 6c  ty_level){.  sql
196f0 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
19700 70 44 62 3b 0a 20 20 69 66 28 20 28 64 62 3d 70  pDb;.  if( (db=p
19710 42 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70  Bt->db)!=0 && (p
19720 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29  Db=db->aDb)!=0 )
19730 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 44 62  {.    while( pDb
19740 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d  ->pBt==0 || pDb-
19750 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29  >pBt->pBt!=pBt )
19760 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 69  { pDb++; }.    i
19770 66 28 20 70 44 62 2d 3e 62 53 79 6e 63 53 65 74  f( pDb->bSyncSet
19780 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70 44 62  ==0 .     && pDb
19790 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d  ->safety_level!=
197a0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 0a 20 20  safety_level .  
197b0 20 20 20 26 26 20 70 44 62 21 3d 26 64 62 2d 3e     && pDb!=&db->
197c0 61 44 62 5b 31 5d 20 0a 20 20 20 20 29 7b 0a 20  aDb[1] .    ){. 
197d0 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79       pDb->safety
197e0 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65 74 79 5f  _level = safety_
197f0 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 73 71 6c  level;.      sql
19800 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67  ite3PagerSetFlag
19810 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 0a 20  s(pBt->pPager,. 
19820 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
19830 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
19840 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
19850 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
19860 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
19870 23 20 64 65 66 69 6e 65 20 73 65 74 44 65 66 61  # define setDefa
19880 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
19890 73 61 66 65 74 79 5f 6c 65 76 65 6c 29 0a 23 65  safety_level).#e
198a0 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  ndif../* Forward
198b0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
198c0 73 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61  static int newDa
198d0 74 61 62 61 73 65 28 42 74 53 68 61 72 65 64 2a  tabase(BtShared*
198e0 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  );.../*.** Get a
198f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
19900 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
19910 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
19920 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
19930 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
19940 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
19950 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
19960 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
19970 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
19980 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
19990 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
199a0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
199b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
199c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
199d0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
199e0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
199f0 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
19a00 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
19a10 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
19a20 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
19a30 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
19a40 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
19a50 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19a60 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
19a70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
19a80 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
19a90 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
19aa0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
19ab0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
19ac0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19ad0 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65  e */.  u32 nPage
19ae0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19af0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19b00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
19b10 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 46 69 6c  /.  u32 nPageFil
19b20 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
19b30 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
19b40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19b50 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65 48   */.  u32 nPageH
19b60 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
19b70 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
19b80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
19b90 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
19ba0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
19bb0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
19bc0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
19bd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
19be0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
19bf0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
19c00 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
19c10 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
19c20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
19c30 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
19c40 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
19c50 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
19c60 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19c70 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19c80 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
19c90 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
19ca0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
19cb0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
19cc0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
19cd0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
19ce0 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
19cf0 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
19d00 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
19d10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
19d20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
19d30 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
19d40 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e 50 61 67  ger, (int*)&nPag
19d50 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
19d60 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
19d70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
19d80 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
19d90 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
19da0 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
19db0 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
19dc0 7d 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62  }.  if( (pBt->db
19dd0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
19de0 5f 52 65 73 65 74 44 61 74 61 62 61 73 65 29 21  _ResetDatabase)!
19df0 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20  =0 ){.    nPage 
19e00 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  = 0;.  }.  if( n
19e10 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
19e20 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
19e30 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
19e40 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
19e50 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
19e60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
19e70 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
19e80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
19e90 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
19ea0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
19eb0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
19ec0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
19ed0 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
19ee0 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
19ef0 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
19f00 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
19f10 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
19f20 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
19f30 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
19f40 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
19f50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
19f60 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
19f70 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
19f80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
19f90 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
19fa0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
19fb0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
19fc0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
19fd0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
19fe0 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
19ff0 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1a000 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1a010 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
1a020 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
1a030 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1a040 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
1a050 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
1a060 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
1a070 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a080 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a090 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1a0a0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
1a0b0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
1a0c0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
1a0d0 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
1a0e0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
1a0f0 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
1a100 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1a110 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
1a120 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
1a130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
1a140 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
1a150 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
1a160 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
1a170 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
1a180 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
1a190 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
1a1a0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
1a1b0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
1a1c0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
1a1d0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
1a1e0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
1a1f0 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
1a200 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
1a210 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
1a220 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
1a230 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
1a240 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
1a250 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1a260 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
1a270 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
1a280 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
1a290 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
1a2a0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
1a2b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a2c0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
1a2d0 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
1a2e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1a2f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a300 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
1a310 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
1a320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1a330 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46   setDefaultSyncF
1a340 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f  lag(pBt, SQLITE_
1a350 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
1a360 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
1a370 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d      if( isOpen==
1a380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
1a390 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50  eleasePageOne(pP
1a3a0 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 20  age1);.         
1a3b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a3c0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  K;.        }.   
1a3d0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
1a3e0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
1a3f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a400 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
1a410 61 67 28 70 42 74 2c 20 53 51 4c 49 54 45 5f 44  ag(pBt, SQLITE_D
1a420 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
1a430 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  US+1);.    }.#en
1a440 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44  dif..    /* EVID
1a450 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35  ENCE-OF: R-15465
1a460 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d  -20813 The maxim
1a470 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65  um and minimum e
1a480 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a  mbedded payload.
1a490 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73      ** fractions
1a4a0 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61   and the leaf pa
1a4b0 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76  yload fraction v
1a4c0 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36 34  alues must be 64
1a4d0 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20  , 32, and 32..  
1a4e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1a4f0 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20  original design 
1a500 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d  allowed these am
1a510 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62  ounts to vary, b
1a520 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20  ut as of.    ** 
1a530 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77  version 3.6.0, w
1a540 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74  e require them t
1a550 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20  o be fixed..    
1a560 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d  */.    if( memcm
1a570 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c  p(&page1[21], "\
1a580 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21  100\040\040",3)!
1a590 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
1a5a0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1a5b0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  ed;.    }.    /*
1a5c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a5d0 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65 20  51873-39618 The 
1a5e0 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20  page size for a 
1a5f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1a600 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e  .    ** determin
1a610 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74 65  ed by the 2-byte
1a620 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64   integer located
1a630 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
1a640 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20   16 bytes from. 
1a650 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e     ** the beginn
1a660 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
1a670 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
1a680 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67   pageSize = (pag
1a690 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61  e1[16]<<8) | (pa
1a6a0 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20  ge1[17]<<16);.  
1a6b0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a6c0 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20  : R-25008-21688 
1a6d0 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  The size of a pa
1a6e0 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  ge is a power of
1a6f0 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77   two.    ** betw
1a700 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33  een 512 and 6553
1a710 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a  6 inclusive. */.
1a720 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
1a730 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
1a740 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  =0.     || pageS
1a750 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
1a760 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c  AGE_SIZE .     |
1a770 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20  | pageSize<=256 
1a780 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f  .    ){.      go
1a790 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
1a7a0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
1a7b0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
1a7c0 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
1a7d0 58 45 44 3b 0a 20 20 20 20 61 73 73 65 72 74 28  XED;.    assert(
1a7e0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
1a7f0 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =0 );.    /* EVI
1a800 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31  DENCE-OF: R-5931
1a810 30 2d 35 31 32 30 35 20 54 68 65 20 22 72 65 73  0-51205 The "res
1a820 65 72 76 65 64 20 73 70 61 63 65 22 20 73 69 7a  erved space" siz
1a830 65 20 69 6e 20 74 68 65 20 31 2d 62 79 74 65 0a  e in the 1-byte.
1a840 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
1a850 74 20 6f 66 66 73 65 74 20 32 30 20 69 73 20 74  t offset 20 is t
1a860 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1a870 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
1a880 68 65 20 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a  he end of.    **
1a890 20 65 61 63 68 20 70 61 67 65 20 74 6f 20 72 65   each page to re
1a8a0 73 65 72 76 65 20 66 6f 72 20 65 78 74 65 6e 73  serve for extens
1a8b0 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  ions. .    **.  
1a8c0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1a8d0 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20  : R-37497-42412 
1a8e0 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
1a8f0 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20  reserved region 
1a900 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
1a910 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d  ined by the one-
1a920 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e  byte unsigned in
1a930 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61  teger found at a
1a940 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20  n offset of 20. 
1a950 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
1a960 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
1a970 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62  der. */.    usab
1a980 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
1a990 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
1a9a0 20 20 20 69 66 28 20 28 75 33 32 29 70 61 67 65     if( (u32)page
1a9b0 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65 53  Size!=pBt->pageS
1a9c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1a9d0 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74 68  After reading th
1a9e0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1a9f0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1aa00 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69 7a  uming a page siz
1aa10 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42 74  e.      ** of Bt
1aa20 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65 2c  Shared.pageSize,
1aa30 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76 65   we have discove
1aa40 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67  red that the pag
1aa50 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20 20  e-size is.      
1aa60 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67 65  ** actually page
1aa70 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65  Size. Unlock the
1aa80 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76 65   database, leave
1aa90 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74 0a   pBt->pPage1 at.
1aaa0 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e        ** zero an
1aab0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1aac0 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  OK. The caller w
1aad0 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66 75  ill call this fu
1aae0 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nction.      ** 
1aaf0 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20 63  again with the c
1ab00 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a 65  orrect page-size
1ab10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1ab20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1ab30 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70  pPage1);.      p
1ab40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1ab50 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20   usableSize;.   
1ab60 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
1ab70 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
1ab80 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
1ab90 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
1aba0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
1abb0 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
1abc0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
1abd0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53 69            pageSi
1ac00 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  ze-usableSize);.
1ac10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ac20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
1ac30 71 6c 69 74 65 33 57 72 69 74 61 62 6c 65 53 63  qlite3WritableSc
1ac40 68 65 6d 61 28 70 42 74 2d 3e 64 62 29 3d 3d 30  hema(pBt->db)==0
1ac50 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
1ac60 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
1ac70 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
1ac80 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
1ac90 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1aca0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
1acb0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1acc0 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
1acd0 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
1ace0 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
1acf0 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
1ad00 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
1ad10 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1ad20 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
1ad30 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
1ad40 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
1ad50 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
1ad60 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
1ad70 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
1ad80 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
1ad90 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
1ada0 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
1adb0 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
1adc0 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
1add0 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
1ade0 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
1adf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ae00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ae10 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
1ae20 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
1ae30 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
1ae40 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
1ae50 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
1ae60 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
1ae70 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
1ae80 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
1ae90 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
1aea0 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
1aeb0 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
1aec0 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
1aed0 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
1aee0 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
1aef0 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
1af00 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
1af10 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
1af20 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
1af30 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
1af40 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
1af50 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
1af60 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
1af70 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
1af80 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
1af90 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
1afa0 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
1afb0 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
1afc0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
1afd0 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
1afe0 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
1aff0 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
1b000 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
1b010 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
1b020 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
1b030 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
1b040 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
1b050 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
1b060 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
1b070 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
1b080 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
1b090 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
1b0a0 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
1b0b0 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
1b0c0 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
1b0d0 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
1b0e0 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
1b0f0 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
1b100 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
1b110 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
1b120 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
1b130 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
1b140 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
1b150 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
1b160 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
1b170 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
1b180 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
1b190 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1b1a0 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
1b1b0 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
1b1c0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
1b1d0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
1b1e0 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
1b1f0 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
1b200 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1b210 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
1b220 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
1b230 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
1b240 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
1b250 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
1b260 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
1b270 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
1b280 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
1b290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b2a0 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
1b2b0 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
1b2c0 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1b2d0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
1b2e0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1b2f0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1b300 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  BUG./*.** Return
1b310 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1b320 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70  ursors open on p
1b330 42 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  Bt. This is for 
1b340 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
1b350 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
1b360 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
1b370 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
1b380 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
1b390 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77  ed..**.** Only w
1b3a0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
1b3b0 20 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e   counted if wrOn
1b3c0 6c 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20  ly is true.  If 
1b3d0 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c  wrOnly is.** fal
1b3e0 73 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73  se then all curs
1b3f0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e  ors are counted.
1b400 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
1b410 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
1b420 72 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f  routine, a curso
1b430 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20  r is any cursor 
1b440 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62  that.** is capab
1b450 6c 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72  le of reading or
1b460 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
1b470 64 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f  database.  Curso
1b480 72 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20  rs that.** have 
1b490 62 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74  been tripped int
1b4a0 6f 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55  o the CURSOR_FAU
1b4b0 4c 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74  LT state are not
1b4c0 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61   counted..*/.sta
1b4d0 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c  tic int countVal
1b4e0 69 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72  idCursors(BtShar
1b4f0 65 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f  ed *pBt, int wrO
1b500 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
1b510 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
1b520 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
1b530 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
1b540 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
1b550 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
1b560 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43  wrOnly==0 || (pC
1b570 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
1b580 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d  TCF_WriteFlag)!=
1b590 30 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  0).     && pCur-
1b5a0 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
1b5b0 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20  FAULT ) r++; .  
1b5c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a  }.  return r;.}.
1b5d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
1b5e0 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
1b5f0 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
1b600 73 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74  s and we are not
1b610 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a   in the middle.*
1b620 2a 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69  * of a transacti
1b630 6f 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20  on but there is 
1b640 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
1b650 68 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  he database, the
1b660 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
1b670 65 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72  e unrefs the fir
1b680 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
1b690 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69  atabase file whi
1b6a0 63 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65  ch .** has the e
1b6b0 66 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69  ffect of releasi
1b6c0 6e 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  ng the read lock
1b6d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
1b6e0 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f   is a transactio
1b6f0 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74  n in progress, t
1b700 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1b710 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
1b720 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72  c void unlockBtr
1b730 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61  eeIfUnused(BtSha
1b740 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73  red *pBt){.  ass
1b750 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b760 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1b770 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1b780 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1b790 72 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20  rs(pBt,0)==0 || 
1b7a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b7b0 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b  on>TRANS_NONE );
1b7c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
1b7d0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1b7e0 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50  _NONE && pBt->pP
1b7f0 61 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d  age1!=0 ){.    M
1b800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d  emPage *pPage1 =
1b810 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1b820 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31    assert( pPage1
1b830 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
1b840 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
1b850 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
1b860 3e 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20  >pPager)==1 );. 
1b870 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
1b880 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   0;.    releaseP
1b890 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1b8a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
1b8b0 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  pBt points to an
1b8c0 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e   empty file then
1b8d0 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d   convert that em
1b8e0 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f  pty file.** into
1b8f0 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74   a new empty dat
1b900 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
1b910 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
1b920 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64  page of.** the d
1b930 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
1b940 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61  ic int newDataba
1b950 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  se(BtShared *pBt
1b960 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1b970 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
1b980 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20  ar *data;.  int 
1b990 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1b9a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b9b0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1b9c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67  .  if( pBt->nPag
1b9d0 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e>0 ){.    retur
1b9e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b9f0 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50  .  pP1 = pBt->pP
1ba00 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20  age1;.  assert( 
1ba10 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61  pP1!=0 );.  data
1ba20 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20   = pP1->aData;. 
1ba30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ba40 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62  erWrite(pP1->pDb
1ba50 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1ba60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d  ) return rc;.  m
1ba70 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67  emcpy(data, zMag
1ba80 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66  icHeader, sizeof
1ba90 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b  (zMagicHeader));
1baa0 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f  .  assert( sizeo
1bab0 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d  f(zMagicHeader)=
1bac0 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36  =16 );.  data[16
1bad0 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70  ] = (u8)((pBt->p
1bae0 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66  ageSize>>8)&0xff
1baf0 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20  );.  data[17] = 
1bb00 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
1bb10 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a  ize>>16)&0xff);.
1bb20 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a    data[18] = 1;.
1bb30 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a    data[19] = 1;.
1bb40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
1bb50 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e  sableSize<=pBt->
1bb60 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d  pageSize && pBt-
1bb70 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e  >usableSize+255>
1bb80 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  =pBt->pageSize);
1bb90 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75  .  data[20] = (u
1bba0 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
1bbb0 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
1bbc0 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20  ze);.  data[21] 
1bbd0 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d  = 64;.  data[22]
1bbe0 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33   = 32;.  data[23
1bbf0 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74  ] = 32;.  memset
1bc00 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31  (&data[24], 0, 1
1bc10 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61  00-24);.  zeroPa
1bc20 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b  ge(pP1, PTF_INTK
1bc30 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f  EY|PTF_LEAF|PTF_
1bc40 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42  LEAFDATA );.  pB
1bc50 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1bc60 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
1bc70 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
1bc80 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1bc90 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  M.  assert( pBt-
1bca0 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c  >autoVacuum==1 |
1bcb0 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  | pBt->autoVacuu
1bcc0 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  m==0 );.  assert
1bcd0 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  ( pBt->incrVacuu
1bce0 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63  m==1 || pBt->inc
1bcf0 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  rVacuum==0 );.  
1bd00 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
1bd10 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61  6 + 4*4], pBt->a
1bd20 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75  utoVacuum);.  pu
1bd30 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
1bd40 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63  + 7*4], pBt->inc
1bd50 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66  rVacuum);.#endif
1bd60 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20  .  pBt->nPage = 
1bd70 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20  1;.  data[31] = 
1bd80 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
1bd90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1bda0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66  Initialize the f
1bdb0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1bdc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1bdd0 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
1bde0 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e  ase.** consistin
1bdf0 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  g of a single pa
1be00 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61  ge and no schema
1be10 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72   objects). Retur
1be20 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  n SQLITE_OK.** i
1be30 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
1be40 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
1be50 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1be60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1be70 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20  treeNewDb(Btree 
1be80 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1be90 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1bea0 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d  er(p);.  p->pBt-
1beb0 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63  >nPage = 0;.  rc
1bec0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1bed0 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65  ->pBt);.  sqlite
1bee0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1bef0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bf00 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1bf10 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61   start a new tra
1bf20 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74  nsaction. A writ
1bf30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  e-transaction.**
1bf40 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74   is started if t
1bf50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1bf60 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f  nt is nonzero, o
1bf70 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d  therwise a read-
1bf80 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1bf90 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
1bfa0 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72  argument is 2 or
1bfb0 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73   more and exclus
1bfc0 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ive.** transacti
1bfd0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d  on is started, m
1bfe0 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f  eaning that no o
1bff0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1c000 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63  allowed.** to ac
1c010 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
1c020 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e  e.  A preexistin
1c030 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  g transaction ma
1c040 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72  y not be.** upgr
1c050 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  aded to exclusiv
1c060 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69  e by calling thi
1c070 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f  s routine a seco
1c080 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a  nd time - the.**
1c090 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61   exclusivity fla
1c0a0 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  g only works for
1c0b0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1c0c0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74  on..**.** A writ
1c0d0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
1c0e0 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65  st be started be
1c0f0 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20  fore attempting 
1c100 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20  any .** changes 
1c110 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1c120 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f    None of the fo
1c130 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
1c140 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75   .** will work u
1c150 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74  nless a transact
1c160 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66  ion is started f
1c170 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  irst:.**.**     
1c180 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
1c190 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20  ateTable().**   
1c1a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
1c1b0 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20  reateIndex().** 
1c1c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1c1d0 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a  eClearTable().**
1c1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1c1f0 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a  eeDropTable().**
1c200 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1c210 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20  eeInsert().**   
1c220 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44     sqlite3BtreeD
1c230 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20  elete().**      
1c240 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1c250 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49  teMeta().**.** I
1c260 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74  f an initial att
1c270 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20  empt to acquire 
1c280 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62  the lock fails b
1c290 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63  ecause of lock c
1c2a0 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64  ontention.** and
1c2b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
1c2c0 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c  s previously unl
1c2d0 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f  ocked, then invo
1c2e0 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1c2f0 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  ler.** if there 
1c300 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20  is one.  But if 
1c310 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f  there was previo
1c320 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  usly a read-lock
1c330 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f  , do not.** invo
1c340 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
1c350 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72  ler - just retur
1c360 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
1c370 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a  SQLITE_BUSY is .
1c380 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e  ** returned when
1c390 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
1c3a0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e  y a read-lock in
1c3b0 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20   order to avoid 
1c3c0 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  a deadlock..**.*
1c3d0 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20  * Suppose there 
1c3e0 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  are two processe
1c3f0 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61  s A and B.  A ha
1c400 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e  s a read lock an
1c410 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73  d B has.** a res
1c420 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74  erved lock.  B t
1c430 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1c440 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74  to exclusive but
1c450 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61   is blocked beca
1c460 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65  use.** of A's re
1c470 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65  ad lock.  A trie
1c480 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20  s to promote to 
1c490 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20  reserved but is 
1c4a0 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a  blocked by B..**
1c4b0 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65   One or the othe
1c4c0 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f  r of the two pro
1c4d0 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65  cesses must give
1c4e0 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61   way or there ca
1c4f0 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72  n be.** no progr
1c500 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69  ess.  By returni
1c510 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61  ng SQLITE_BUSY a
1c520 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20  nd not invoking 
1c530 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1c540 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65  k.** when A alre
1c550 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c  ady has a read l
1c560 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67  ock, we encourag
1c570 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61  e A to give up a
1c580 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63  nd let B.** proc
1c590 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  eed..*/.int sqli
1c5a0 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
1c5b0 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ns(Btree *p, int
1c5c0 20 77 72 66 6c 61 67 2c 20 69 6e 74 20 2a 70 53   wrflag, int *pS
1c5d0 63 68 65 6d 61 56 65 72 73 69 6f 6e 29 7b 0a 20  chemaVersion){. 
1c5e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1c5f0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1c600 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1c610 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1c620 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1c630 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1c640 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
1c650 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1c660 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1c670 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
1c680 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
1c690 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
1c6a0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
1c6b0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
1c6c0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
1c6d0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1c6e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1c6f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1c700 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
1c710 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
1c720 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
1c730 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1c740 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1c750 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1c760 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
1c770 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
1c780 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
1c790 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e 64 62 2d  ;..  if( (p->db-
1c7a0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1c7b0 52 65 73 65 74 44 61 74 61 62 61 73 65 29 20 0a  ResetDatabase) .
1c7c0 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
1c7d0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74  erIsreadonly(pBt
1c7e0 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 0a 20 20  ->pPager)==0 .  
1c7f0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  ){.    pBt->btsF
1c800 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 52 45 41  lags &= ~BTS_REA
1c810 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f  D_ONLY;.  }..  /
1c820 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63 74  * Write transact
1c830 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f 73  ions are not pos
1c840 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64 2d  sible on a read-
1c850 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
1c860 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73  .  if( (pBt->bts
1c870 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
1c880 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77 72 66  _ONLY)!=0 && wrf
1c890 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
1c8a0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c8b0 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
1c8c0 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e  begun;.  }..#ifn
1c8d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1c8e0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 7b  SHARED_CACHE.  {
1c8f0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 42  .    sqlite3 *pB
1c900 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  lock = 0;.    /*
1c910 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
1c920 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
1c930 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
1c940 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
1c950 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  on .    ** on th
1c960 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
1c970 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
1c980 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
1c990 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  nsaction is.    
1c9a0 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65  ** requested, re
1c9b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
1c9c0 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ED..    */.    i
1c9d0 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
1c9e0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c9f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
1ca00 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73      || (pBt->bts
1ca10 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44  Flags & BTS_PEND
1ca20 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b 0a 20  ING)!=0.    ){. 
1ca30 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42       pBlock = pB
1ca40 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a  t->pWriter->db;.
1ca50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 77 72      }else if( wr
1ca60 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  flag>1 ){.      
1ca70 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20  BtLock *pIter;. 
1ca80 20 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70       for(pIter=p
1ca90 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1caa0 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1cab0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  Next){.        i
1cac0 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65  f( pIter->pBtree
1cad0 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=p ){.         
1cae0 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
1caf0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
1cb00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1cb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1cb20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1cb30 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  lock ){.      sq
1cb40 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
1cb50 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42  locked(p->db, pB
1cb60 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1cb70 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  = SQLITE_LOCKED_
1cb80 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 20  SHAREDCACHE;.   
1cb90 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1cba0 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  gun;.    }.  }.#
1cbb0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 79 20  endif..  /* Any 
1cbc0 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72 65 61  read-only or rea
1cbd0 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d-write transact
1cbe0 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20 72 65  ion implies a re
1cbf0 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a  ad-lock on .  **
1cc00 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66 20 73   page 1. So if s
1cc10 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  ome other shared
1cc20 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20 61 6c  -cache client al
1cc30 72 65 61 64 79 20 68 61 73 20 61 20 77 72 69 74  ready has a writ
1cc40 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20  e-lock .  ** on 
1cc50 70 61 67 65 20 31 2c 20 74 68 65 20 74 72 61 6e  page 1, the tran
1cc60 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62  saction cannot b
1cc70 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20 20 72  e opened. */.  r
1cc80 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
1cc90 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
1cca0 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45   MASTER_ROOT, RE
1ccb0 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  AD_LOCK);.  if( 
1ccc0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 20  SQLITE_OK!=rc ) 
1ccd0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1cce0 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46 6c 61  ;..  pBt->btsFla
1ccf0 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49 54 49  gs &= ~BTS_INITI
1cd00 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 69 66  ALLY_EMPTY;.  if
1cd10 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 30 20  ( pBt->nPage==0 
1cd20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
1cd30 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  |= BTS_INITIALLY
1cd40 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b 0a 20  _EMPTY;.  do {. 
1cd50 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42     /* Call lockB
1cd60 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65 69 74  tree() until eit
1cd70 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65 31 20  her pBt->pPage1 
1cd80 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 0a  is populated or.
1cd90 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72 65 65      ** lockBtree
1cda0 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d 65 74  () returns somet
1cdb0 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
1cdc0 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42  SQLITE_OK. lockB
1cdd0 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20 6d 61  tree().    ** ma
1cde0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
1cdf0 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70 42 74  OK but leave pBt
1ce00 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74 6f 20  ->pPage1 set to 
1ce10 30 20 69 66 20 61 66 74 65 72 0a 20 20 20 20 2a  0 if after.    *
1ce20 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65 20 31  * reading page 1
1ce30 20 69 74 20 64 69 73 63 6f 76 65 72 73 20 74 68   it discovers th
1ce40 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  at the page-size
1ce50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ce60 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 69 73   .    ** file is
1ce70 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65 53 69   not pBt->pageSi
1ce80 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ze. In this case
1ce90 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77 69 6c   lockBtree() wil
1cea0 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a 2a 20  l update.    ** 
1ceb0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 74 6f  pBt->pageSize to
1cec0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
1ced0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1cee0 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77  sk..    */.    w
1cef0 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65  hile( pBt->pPage
1cf00 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  1==0 && SQLITE_O
1cf10 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42 74 72  K==(rc = lockBtr
1cf20 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 20  ee(pBt)) );..   
1cf30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1cf40 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1cf50 20 20 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e        if( (pBt->
1cf60 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1cf70 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a  EAD_ONLY)!=0 ){.
1cf80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1cf90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
1cfa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cfb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1cfc0 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
1cfd0 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31 2c 73  Pager,wrflag>1,s
1cfe0 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
1cff0 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  ry(p->db));.    
1d000 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d020 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62     rc = newDatab
1d030 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ase(pBt);.      
1d040 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
1d050 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
1d060 53 48 4f 54 20 26 26 20 70 42 74 2d 3e 69 6e 54  SHOT && pBt->inT
1d070 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
1d080 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1d090 20 20 20 20 2f 2a 20 69 66 20 74 68 65 72 65 20      /* if there 
1d0a0 77 61 73 20 6e 6f 20 74 72 61 6e 73 61 63 74 69  was no transacti
1d0b0 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65 6e 20 74  on opened when t
1d0c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
1d0d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
1d0e0 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  lled and SQLITE_
1d0f0 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 69 73  BUSY_SNAPSHOT is
1d100 20 72 65 74 75 72 6e 65 64 2c 20 63 68 61 6e 67   returned, chang
1d110 65 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20  e the error.    
1d120 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 74 6f        ** code to
1d130 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 2a 2f   SQLITE_BUSY. */
1d140 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1d150 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1d160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1d170 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1d180 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d190 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  .      unlockBtr
1d1a0 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
1d1b0 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
1d1c0 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49   (rc&0xFF)==SQLI
1d1d0 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e  TE_BUSY && pBt->
1d1e0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1d1f0 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20  RANS_NONE &&.   
1d200 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f         btreeInvo
1d210 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42  keBusyHandler(pB
1d220 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  t) );.  sqlite3P
1d230 61 67 65 72 52 65 73 65 74 4c 6f 63 6b 54 69 6d  agerResetLockTim
1d240 65 6f 75 74 28 70 42 74 2d 3e 70 50 61 67 65 72  eout(pBt->pPager
1d250 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
1d260 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1d270 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1d280 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1d290 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
1d2a0 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  tion++;.#ifndef 
1d2b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1d2c0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 69  ED_CACHE.      i
1d2d0 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
1d2e0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
1d2f0 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65  ( p->lock.pBtree
1d300 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69  ==p && p->lock.i
1d310 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
1d320 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63      p->lock.eLoc
1d330 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20  k = READ_LOCK;. 
1d340 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70         p->lock.p
1d350 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63  Next = pBt->pLoc
1d360 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  k;.        pBt->
1d370 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b  pLock = &p->lock
1d380 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1d390 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 6e  .    }.    p->in
1d3a0 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67 3f  Trans = (wrflag?
1d3b0 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41 4e  TRANS_WRITE:TRAN
1d3c0 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66 28  S_READ);.    if(
1d3d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74 2d   p->inTrans>pBt-
1d3e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
1d3f0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
1d400 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d 3e  ransaction = p->
1d410 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a 20  inTrans;.    }. 
1d420 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1d430 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  .      MemPage *
1d440 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1d450 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  age1;.#ifndef SQ
1d460 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
1d470 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61 73 73  _CACHE.      ass
1d480 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69 74  ert( !pBt->pWrit
1d490 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  er );.      pBt-
1d4a0 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20 20  >pWriter = p;.  
1d4b0 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
1d4c0 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c 55 53  s &= ~BTS_EXCLUS
1d4d0 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28 20 77  IVE;.      if( w
1d4e0 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d 3e 62  rflag>1 ) pBt->b
1d4f0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 45  tsFlags |= BTS_E
1d500 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64 69 66  XCLUSIVE;.#endif
1d510 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ..      /* If th
1d520 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64 65 72  e db-size header
1d530 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f 72 72   field is incorr
1d540 65 63 74 20 28 61 73 20 69 74 20 6d 61 79 20 62  ect (as it may b
1d550 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20 20 20  e if an old.    
1d560 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61 73 20    ** client has 
1d570 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74 68 65  been writing the
1d580 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 2c   database file),
1d590 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77 2e 20   update it now. 
1d5a0 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74  Doing.      ** t
1d5b0 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74 68 65  his sooner rathe
1d5c0 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d 65 61  r than later mea
1d5d0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
1d5e0 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c 79 20  size can safely 
1d5f0 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72 65 61  .      ** re-rea
1d600 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
1d610 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20 31 20  ize from page 1 
1d620 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20 6f  if a savepoint o
1d630 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  r transaction.  
1d640 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20      ** rollback 
1d650 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68  occurs within th
1d660 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
1d670 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1d680 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 67 65  ( pBt->nPage!=ge
1d690 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
1d6a0 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a 20 20  aData[28]) ){.  
1d6b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d6c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
1d6d0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1d6e0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1d6f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d700 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1d710 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1d720 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1d730 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d740 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 74 72 61  }.    }.  }..tra
1d750 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69 66 28 20  ns_begun:.  if( 
1d760 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d770 0a 20 20 20 20 69 66 28 20 70 53 63 68 65 6d 61  .    if( pSchema
1d780 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Version ){.     
1d790 20 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e   *pSchemaVersion
1d7a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1d7b0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1d7c0 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  40]);.    }.    
1d7d0 69 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20  if( wrflag ){.  
1d7e0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1d7f0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1d800 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
1d810 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
1d820 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 6f 70  r of.      ** op
1d830 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49  en savepoints. I
1d840 66 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  f the second par
1d850 61 6d 65 74 65 72 20 69 73 20 67 72 65 61 74 65  ameter is greate
1d860 72 20 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20  r than 0 and.   
1d870 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f     ** the sub-jo
1d880 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c 72  urnal is not alr
1d890 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e 20  eady open, then 
1d8a0 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65  it will be opene
1d8b0 64 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a 2f  d here..      */
1d8c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1d8d0 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1d8e0 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1d8f0 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
1d900 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  oint);.    }.  }
1d910 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1d920 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
1d930 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1d940 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1d950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d960 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
1d970 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
1d980 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
1d990 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
1d9a0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
1d9b0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
1d9c0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
1d9d0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
1d9e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1d9f0 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
1da00 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
1da10 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
1da20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
1da30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
1da40 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
1da50 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1da60 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da80 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
1da90 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
1daa0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1dab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dac0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
1dad0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
1dae0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1db10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
1db20 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1db30 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
1db40 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
1db50 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
1db60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1db70 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
1db80 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 70 50  ex) );.  rc = pP
1db90 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51  age->isInit ? SQ
1dba0 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49  LITE_OK : btreeI
1dbb0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1dbc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1dbd0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1dbe0 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
1dbf0 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28  ->nCell;..  for(
1dc00 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1dc10 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
1dc20 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1dc30 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72  ge, i);..    ptr
1dc40 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
1dc50 61 67 65 2c 20 70 50 61 67 65 2c 20 70 43 65 6c  age, pPage, pCel
1dc60 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
1dc70 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1dc80 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
1dc90 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1dca0 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
1dcb0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1dcc0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1dcd0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1dce0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1dcf0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1dd00 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
1dd10 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1dd20 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1dd30 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1dd40 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
1dd50 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1dd60 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1dd70 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1dd80 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
1dd90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
1dda0 65 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20  ere on pPage is 
1ddb0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
1ddc0 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79  e iFrom.  Modify
1ddd0 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f   this pointer so
1dde0 0a 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e  .** that it poin
1ddf0 74 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d  ts to iTo. Param
1de00 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72  eter eType descr
1de10 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66  ibes the type of
1de20 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62   pointer to.** b
1de30 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20  e modified, as  
1de40 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50  follows:.**.** P
1de50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20  TRMAP_BTREE:    
1de60 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65   pPage is a btre
1de70 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  e-page. The poin
1de80 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  ter points at a 
1de90 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20  child .**       
1dea0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
1deb0 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a   of pPage..**.**
1dec0 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
1ded0 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74  1: pPage is a bt
1dee0 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
1def0 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
1df00 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20  an overflow.**  
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f   page pointed to
1df30 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   by one of the c
1df40 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a  ells on pPage..*
1df50 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1df60 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20  FLOW2: pPage is 
1df70 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65  an overflow-page
1df80 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f  . The pointer po
1df90 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74  ints at the next
1dfa0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1dfb0 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70        overflow p
1dfc0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  age in the list.
1dfd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1dfe0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1dff0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
1e000 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e   Pgno iFrom, Pgn
1e010 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29  o iTo, u8 eType)
1e020 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1e030 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e040 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
1e050 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
1e060 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
1e070 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
1e080 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
1e090 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1e0a0 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f  ERFLOW2 ){.    /
1e0b0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73  * The pointer is
1e0c0 20 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73   always the firs
1e0d0 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 4 bytes of the
1e0e0 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61   page in this ca
1e0f0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  se.  */.    if( 
1e100 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
1e110 61 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b  aData)!=iFrom ){
1e120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e130 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
1e140 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  E(pPage);.    }.
1e150 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1e160 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
1e170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1e180 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
1e190 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ll;.    int rc;.
1e1a0 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 2d  .    rc = pPage-
1e1b0 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1e1c0 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1e1d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
1e1e0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e1f0 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  rc;.    nCell = 
1e200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
1e210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
1e220 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
1e230 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1e240 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1e250 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
1e260 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e270 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
1e280 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
1e290 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72       pPage->xPar
1e2a0 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
1e2b0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
1e2c0 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c       if( info.nL
1e2d0 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
1e2e0 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ad ){.          
1e2f0 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  if( pCell+info.n
1e300 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
1e310 61 74 61 2b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata+pPage->pBt->
1e320 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
1e330 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1e340 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e350 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1e360 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e370 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 67 65     if( iFrom==ge
1e380 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66  t4byte(pCell+inf
1e390 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b 0a 20 20  o.nSize-4) ){.  
1e3a0 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1e3b0 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1e3c0 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20 20  ize-4, iTo);.   
1e3d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1e3e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1e400 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
1e410 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
1e420 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
1e430 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1e440 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
1e450 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e460 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e470 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
1e480 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
1e490 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
1e4a0 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
1e4b0 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
1e4c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1e4d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1e4e0 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
1e4f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e500 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1e510 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1e520 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1e530 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1e540 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
1e550 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iTo);.    }.  }.
1e560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e570 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  OK;.}.../*.** Mo
1e580 76 65 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  ve the open data
1e590 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1e5a0 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46  e to location iF
1e5b0 72 65 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a  reePage in the .
1e5c0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  ** database. The
1e5d0 20 70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e   pDbPage referen
1e5e0 63 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  ce remains valid
1e5f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f  ..**.** The isCo
1e600 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61  mmit flag indica
1e610 74 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  tes that there i
1e620 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d  s no need to rem
1e630 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68  ember that.** th
1e640 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20  e journal needs 
1e650 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20 62  to be sync()ed b
1e660 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20 70  efore database p
1e670 61 67 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  age pDbPage->pgn
1e680 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69  o .** can be wri
1e690 74 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c  tten to. The cal
1e6a0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1e6b0 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20  promised not to 
1e6c0 77 72 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a  write to that.**
1e6d0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
1e6e0 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
1e6f0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
1e700 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
1e710 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
1e720 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
1e730 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
1e740 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
1e750 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
1e760 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1e770 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
1e780 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
1e790 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
1e7a0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
1e7b0 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
1e7c0 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
1e7d0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1e7e0 6e 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20  no iFreePage,   
1e7f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
1e800 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
1e810 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69  DbPage to */.  i
1e820 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20  nt isCommit     
1e830 20 20 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d          /* isCom
1e840 6d 69 74 20 66 6c 61 67 20 70 61 73 73 65 64 20  mit flag passed 
1e850 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  to sqlite3PagerM
1e860 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ovepage */.){.  
1e870 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
1e880 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
1e890 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
1e8a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
1e8b0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
1e8c0 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
1e8d0 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
1e8e0 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1e8f0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
1e900 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1e910 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e920 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
1e930 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
1e940 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
1e950 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1e960 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1e970 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
1e980 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1e990 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
1e9a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1e9b0 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
1e9c0 20 29 3b 0a 20 20 69 66 28 20 69 44 62 50 61 67   );.  if( iDbPag
1e9d0 65 3c 33 20 29 20 72 65 74 75 72 6e 20 53 51 4c  e<3 ) return SQL
1e9e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e9f0 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1ea00 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1ea10 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1ea20 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1ea30 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1ea40 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1ea50 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1ea60 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1ea70 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1ea80 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1ea90 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1eaa0 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1eab0 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1eac0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1ead0 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1eae0 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1eaf0 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1eb00 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1eb10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1eb20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1eb30 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1eb40 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1eb50 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1eb60 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1eb70 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1eb80 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1eb90 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1eba0 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1ebb0 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1ebc0 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1ebd0 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1ebe0 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1ebf0 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1ec00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1ec10 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1ec20 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1ec30 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1ec40 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1ec50 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1ec60 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1ec70 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1ec80 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1ec90 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1eca0 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1ecb0 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1ecc0 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1ecd0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1ece0 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1ecf0 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1ed00 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1ed10 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1ed20 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1ed30 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1ed40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ed50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1ed60 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1ed70 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1ed80 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1ed90 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1eda0 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1edb0 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1edc0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1edd0 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1ede0 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1edf0 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1ee00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ee10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ee20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1ee30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1ee40 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1ee50 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1ee60 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1ee70 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1ee80 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1ee90 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1eea0 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1eeb0 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1eec0 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1eed0 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1eee0 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1eef0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1ef00 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1ef10 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1ef20 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1ef30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1ef40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ef50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ef60 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1ef70 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1ef80 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1ef90 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1efa0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1efb0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1efc0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1efd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1efe0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1eff0 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1f000 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1f010 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1f020 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1f030 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1f040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f050 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1f060 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1f070 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1f080 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1f090 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f0a0 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1f0b0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1f0c0 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1f0d0 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1f0e0 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1f0f0 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1f100 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1f110 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1f120 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1f130 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1f140 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1f150 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1f160 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1f170 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1f180 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1f190 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1f1a0 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1f1b0 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1f1c0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1f1d0 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1f1e0 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1f1f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1f200 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1f210 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1f220 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1f230 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1f240 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1f250 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1f260 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1f270 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1f280 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1f290 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1f2a0 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1f2b0 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1f2c0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1f2d0 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1f2e0 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1f2f0 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1f300 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1f310 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1f320 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1f330 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1f340 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1f350 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1f360 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1f370 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1f380 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1f390 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1f3a0 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1f3b0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1f3c0 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1f3d0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1f3e0 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1f3f0 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1f400 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1f410 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1f420 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1f430 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1f440 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1f450 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1f460 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1f470 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1f480 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1f490 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1f4a0 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1f4b0 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1f4c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f4d0 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1f4e0 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1f4f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1f500 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1f510 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1f520 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1f530 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1f540 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1f550 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1f560 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1f570 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1f580 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1f590 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1f5a0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1f5b0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1f5c0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1f5d0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1f5e0 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1f5f0 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1f600 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1f610 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1f620 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1f630 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1f640 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1f650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1f670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1f680 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1f690 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1f6a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f6b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f6c0 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1f6d0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1f6e0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1f6f0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1f700 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1f710 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1f720 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1f730 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1f740 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1f750 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1f760 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1f770 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1f780 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1f790 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1f7a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1f7b0 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1f7c0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1f7d0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1f7e0 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1f7f0 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1f800 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1f810 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1f820 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1f830 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1f840 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1f850 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1f860 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1f870 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1f880 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1f890 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1f8a0 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1f8b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1f8d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f8e0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1f8f0 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1f900 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1f910 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1f920 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1f930 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1f940 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1f950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1f960 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1f970 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1f980 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1f990 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1f9a0 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1f9b0 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1f9c0 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1f9d0 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1f9e0 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1f9f0 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1fa00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1fa10 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1fa20 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1fa30 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1fa40 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1fa50 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1fa60 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1fa70 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fa80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fa90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1faa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1fab0 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1fac0 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1fad0 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1fae0 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1faf0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1fb00 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1fb10 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1fb20 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1fb30 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1fb40 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1fb50 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1fb60 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1fb70 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1fb80 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1fb90 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1fba0 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1fbb0 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1fbc0 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1fbd0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1fbe0 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1fbf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1fc00 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1fc10 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1fc20 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1fc30 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1fc40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1fc50 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1fc60 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1fc70 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1fc80 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1fc90 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1fca0 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1fcb0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1fcc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1fcd0 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1fce0 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1fcf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1fd00 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1fd10 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1fd20 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1fd30 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1fd40 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1fd50 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1fd60 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1fd70 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1fd80 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1fd90 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1fda0 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1fdb0 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1fdc0 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1fdd0 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1fde0 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1fdf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1fe00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1fe10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1fe20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1fe30 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1fe40 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1fe50 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1fe60 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1fe70 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1fe80 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1fe90 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1fea0 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1feb0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1fec0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1fed0 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1fee0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1fef0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1ff00 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1ff10 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1ff20 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1ff30 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1ff40 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1ff50 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1ff60 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1ff70 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1ff80 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1ff90 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1ffa0 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1ffb0 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1ffc0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1ffd0 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1ffe0 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1fff0 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
20000 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
20010 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20030 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
20040 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
20050 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
20060 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
20070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
20080 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
20090 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
200a0 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
200b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
200c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
200d0 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
200e0 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
200f0 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
20100 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
20110 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
20120 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
20130 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
20140 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
20150 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
20160 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
20170 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
20180 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
20190 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
201a0 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
201b0 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
201c0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
201d0 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
201e0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
201f0 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
20200 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
20210 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
20220 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
20230 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
20240 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
20250 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
20260 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
20270 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
20280 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
20290 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
202a0 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
202b0 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
202c0 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
202d0 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
202e0 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
202f0 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
20300 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
20310 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
20320 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
20330 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
20340 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
20350 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
20360 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20370 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
20380 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
20390 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
203a0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
203b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
203c0 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
203d0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
203e0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
203f0 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
20400 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
20410 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
20420 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
20430 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
20440 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
20450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
20460 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
20470 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
20480 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
20490 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
204a0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
204b0 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
204c0 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
204d0 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
204e0 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
204f0 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
20500 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
20510 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20520 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
20530 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
20540 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
20550 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
20560 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20570 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
20580 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
20590 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
205a0 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
205b0 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
205c0 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
205d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
205e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
205f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20600 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20610 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
20620 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20630 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
20640 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
20650 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
20660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
20670 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
20680 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
20690 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
206a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
206b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
206c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
206d0 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
206e0 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
206f0 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
20700 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
20710 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
20720 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
20730 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
20740 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20750 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
20760 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
20770 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
20780 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
20790 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
207a0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
207b0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
207c0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
207d0 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
207e0 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
207f0 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
20800 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
20810 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
20820 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
20830 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
20840 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
20850 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
20860 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20870 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
20880 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
20890 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
208a0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
208b0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
208c0 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
208d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
208e0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
208f0 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
20900 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
20910 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
20920 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
20930 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
20940 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
20950 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
20960 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
20970 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
20980 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
20990 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
209a0 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
209b0 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
209c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
209d0 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
209e0 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
209f0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
20a00 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
20a10 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
20a20 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
20a30 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
20a40 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
20a50 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
20a60 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
20a70 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
20a80 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
20a90 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
20aa0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
20ab0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
20ac0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
20ad0 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
20ae0 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
20af0 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
20b00 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
20b10 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
20b20 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
20b30 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
20b40 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
20b50 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
20b60 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
20b70 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
20b80 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
20b90 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20ba0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
20bb0 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
20bc0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
20bd0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
20be0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
20bf0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
20c00 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
20c10 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
20c20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
20c30 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
20c40 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
20c50 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
20c60 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
20c70 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
20c80 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
20c90 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
20ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
20cb0 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
20cc0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
20cd0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
20ce0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
20cf0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
20d00 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
20d10 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
20d20 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
20d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20d40 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
20d50 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20d60 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
20d70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
20d90 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
20da0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
20db0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
20dc0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
20dd0 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
20de0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
20df0 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
20e00 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
20e10 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
20e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20e30 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
20e40 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20e50 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
20e60 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
20e70 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
20e80 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
20e90 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
20ea0 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
20eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20ec0 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
20ed0 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
20ee0 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
20ef0 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
20f00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
20f10 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
20f20 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
20f30 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
20f40 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
20f50 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
20f60 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
20f70 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
20f80 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
20f90 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
20fa0 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
20fb0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
20fc0 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
20fd0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
20fe0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
20ff0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
21000 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
21010 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
21020 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
21030 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
21040 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
21050 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
21060 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
21070 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
21080 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
21090 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
210a0 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
210b0 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
210c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
210d0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
210e0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
210f0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
21100 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
21110 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21120 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
21130 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
21140 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
21150 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
21160 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
21170 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
21180 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
21190 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
211a0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
211b0 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
211c0 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
211d0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
211e0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
211f0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
21200 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
21210 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
21220 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
21230 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
21240 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
21250 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
21260 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
21270 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
21280 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
21290 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
212a0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
212b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
212c0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
212d0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
212e0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
212f0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
21300 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
21310 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
21320 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
21330 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
21340 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
21350 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
21360 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
21370 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
21380 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
21390 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
213a0 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
213b0 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
213c0 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
213d0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
213e0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
213f0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
21400 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
21410 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
21420 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
21430 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
21440 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
21450 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
21460 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
21470 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
21480 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
21490 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
214a0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
214b0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
214c0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
214d0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
214e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
214f0 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
21500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
21510 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
21520 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
21530 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
21540 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
21550 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
21560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21570 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21580 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
21590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
215a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
215b0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
215c0 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
215d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
215e0 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
215f0 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
21600 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
21610 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
21620 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
21630 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
21640 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
21650 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
21660 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
21670 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
21680 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21690 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
216a0 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
216b0 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
216c0 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
216d0 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
216e0 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
216f0 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
21700 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
21710 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
21720 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
21730 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21740 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
21750 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
21760 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
21770 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
21780 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
21790 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
217a0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
217b0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
217c0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
217d0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
217e0 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
217f0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
21800 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
21810 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
21820 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
21830 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
21840 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
21850 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
21860 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
21870 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
21880 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
21890 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
218a0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
218b0 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
218c0 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
218d0 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
218e0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
218f0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
21900 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
21910 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
21920 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
21930 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
21940 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
21950 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
21960 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
21970 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
21980 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
21990 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
219a0 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
219b0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
219c0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
219d0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
219e0 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
219f0 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
21a00 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
21a10 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
21a20 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
21a30 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
21a40 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
21a50 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
21a60 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
21a70 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
21a80 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
21a90 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
21aa0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
21ab0 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
21ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21ad0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
21ae0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
21af0 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
21b00 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
21b10 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
21b20 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
21b30 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
21b40 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
21b50 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
21b60 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
21b70 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
21b80 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
21b90 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
21ba0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
21bb0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
21bc0 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
21bd0 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
21be0 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
21bf0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
21c00 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
21c10 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
21c20 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
21c30 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
21c40 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
21c50 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
21c60 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
21c70 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
21c80 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
21c90 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
21ca0 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
21cb0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21cc0 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
21cd0 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
21ce0 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
21cf0 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
21d00 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
21d10 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
21d20 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
21d30 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
21d40 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
21d50 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
21d60 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
21d70 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
21d80 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
21d90 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
21da0 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
21db0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
21dc0 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
21dd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
21de0 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
21df0 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
21e00 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
21e10 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
21e20 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
21e30 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
21e40 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
21e50 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
21e60 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
21e70 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
21e80 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
21e90 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
21ea0 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
21eb0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
21ec0 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
21ed0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
21ee0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
21ef0 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
21f00 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
21f10 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
21f20 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
21f30 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
21f40 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
21f50 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
21f60 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
21f70 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
21f80 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
21f90 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
21fa0 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
21fb0 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
21fc0 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
21fd0 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
21fe0 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
21ff0 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
22000 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
22010 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
22020 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
22030 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
22040 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
22050 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
22060 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
22070 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
22080 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
22090 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
220a0 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
220b0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
220c0 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
220d0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
220e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
220f0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
22100 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
22110 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
22120 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
22130 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
22140 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
22150 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
22160 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
22170 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
22180 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
22190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
221a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
221b0 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
221c0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
221d0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
221e0 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
221f0 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
22200 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
22210 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
22220 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
22230 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
22240 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
22250 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
22260 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
22270 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
22280 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
22290 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
222a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
222b0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
222c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
222d0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
222e0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
222f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
22300 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
22310 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
22320 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
22330 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
22340 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
22350 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
22360 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
22370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22380 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
22390 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
223a0 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
223b0 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
223c0 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
223d0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
223e0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
223f0 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
22400 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
22410 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
22420 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
22430 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22440 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22450 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
22460 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
22470 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
22480 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
22490 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
224a0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
224b0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
224c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
224d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
224e0 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
224f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22510 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
22520 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
22530 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22540 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
22550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
22560 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
22570 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
22580 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
22590 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
225a0 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
225b0 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
225c0 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
225d0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
225e0 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
225f0 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
22600 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
22610 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
22620 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
22630 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
22640 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
22650 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
22660 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
22670 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
22680 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
22690 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
226a0 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
226b0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
226c0 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
226d0 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
226e0 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
226f0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
22700 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
22710 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
22720 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
22730 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
22740 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
22750 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
22760 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
22770 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
22780 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
22790 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
227a0 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
227b0 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
227c0 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
227d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
227e0 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
227f0 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
22800 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
22810 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
22820 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
22830 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
22840 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
22850 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
22860 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
22870 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
22880 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
22890 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
228a0 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
228b0 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
228c0 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
228d0 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
228e0 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
228f0 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
22900 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
22910 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
22920 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
22930 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
22940 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
22950 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
22960 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
22970 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
22980 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
22990 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
229a0 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
229b0 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
229c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
229d0 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
229e0 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
229f0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
22a00 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
22a10 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
22a20 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
22a30 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
22a40 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
22a50 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
22a60 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
22a70 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
22a80 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
22a90 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22aa0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
22ab0 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
22ac0 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
22ad0 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
22ae0 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
22af0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
22b00 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
22b10 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
22b20 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
22b30 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
22b40 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
22b50 66 28 20 77 72 69 74 65 4f 6e 6c 79 20 26 26 20  f( writeOnly && 
22b60 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  (p->curFlags & B
22b70 54 43 46 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d  TCF_WriteFlag)==
22b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
22b90 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
22ba0 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65  OR_VALID || p->e
22bb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b  State==CURSOR_SK
22bc0 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20  IPNEXT ){.      
22bd0 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
22be0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
22bf0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
22c00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22c10 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
22c20 29 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69  )sqlite3BtreeTri
22c30 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 72  pAllCursors(pBtr
22c40 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20  ee, rc, 0);.    
22c50 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22c60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22c70 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
22c80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22c90 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
22ca0 72 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  r(p);.        p-
22cb0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
22cc0 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20 20 20 20  _FAULT;.        
22cd0 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 65 72  p->skipNext = er
22ce0 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20  rCode;.      }. 
22cf0 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
22d00 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
22d10 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  p);.    }.    sq
22d20 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
22d30 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
22d40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22d50 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
22d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
22d70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49  rogress..**.** I
22d80 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
22d90 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e  t SQLITE_OK then
22da0 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65   cursors will be
22db0 20 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72   invalidated (tr
22dc0 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20  ipped)..** Only 
22dd0 77 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72  write cursors ar
22de0 65 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69  e tripped if wri
22df0 74 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62  teOnly is true b
22e00 75 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  ut all cursors a
22e10 72 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66  re.** tripped if
22e20 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
22e30 6c 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  lse.  Any attemp
22e40 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72  t to use.** a tr
22e50 69 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c  ipped cursor wil
22e60 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65  l result in an e
22e70 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
22e80 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
22e90 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
22ea0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22eb0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
22ec0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
22ed0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
22ee0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
22ef0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
22f00 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
22f10 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ck(Btree *p, int
22f20 20 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77   tripCode, int w
22f30 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  riteOnly){.  int
22f40 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
22f50 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
22f60 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
22f70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69  ;..  assert( wri
22f80 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69  teOnly==1 || wri
22f90 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61  teOnly==0 );.  a
22fa0 73 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d  ssert( tripCode=
22fb0 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  =SQLITE_ABORT_RO
22fc0 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f  LLBACK || tripCo
22fd0 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
22fe0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
22ff0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74  nter(p);.  if( t
23000 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
23010 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74  OK ){.    rc = t
23020 72 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c  ripCode = saveAl
23030 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
23040 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
23050 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b  ) writeOnly = 0;
23060 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
23070 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
23080 7d 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  }.  if( tripCode
23090 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20   ){.    int rc2 
230a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  = sqlite3BtreeTr
230b0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20  ipAllCursors(p, 
230c0 74 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f  tripCode, writeO
230d0 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nly);.    assert
230e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
230f0 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  || (writeOnly==0
23100 20 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f   && rc2==SQLITE_
23110 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  OK) );.    if( r
23120 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  c2!=SQLITE_OK ) 
23130 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20  rc = rc2;.  }.  
23140 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
23150 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
23160 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
23170 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
23180 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
23190 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
231a0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
231b0 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
231c0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
231d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
231e0 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
231f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
23200 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
23210 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
23220 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
23230 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
23240 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
23250 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
23260 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f  btreeGetPage() o
23270 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74  n page 1 again t
23280 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
23290 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  re pPage1->aData
232a0 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
232b0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74  y. */.    if( bt
232c0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
232d0 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d  1, &pPage1, 0)==
232e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
232f0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67     int nPage = g
23300 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
23310 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
23320 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
23330 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
23340 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
23350 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
23360 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
23370 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20  er, &nPage);.   
23380 20 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74     testcase( pBt
23390 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29  ->nPage!=nPage )
233a0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
233b0 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ge = nPage;.    
233c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
233d0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a  (pPage1);.    }.
233e0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
233f0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
23400 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20  t, 1)==0 );.    
23410 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
23420 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
23430 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48  .    btreeClearH
23440 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a  asContent(pBt);.
23450 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54    }..  btreeEndT
23460 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20  ransaction(p);. 
23470 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
23480 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
23490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  rc;.}../*.** Sta
234a0 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  rt a statement s
234b0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  ubtransaction. T
234c0 68 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  he subtransactio
234d0 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 0a  n can be rolled.
234e0 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
234f0 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
23500 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 59  n transaction. Y
23510 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
23520 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20  transaction .** 
23530 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20  before starting 
23540 61 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  a subtransaction
23550 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
23560 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
23570 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20  tomatically .** 
23580 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  if the main tran
23590 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 20  saction commits 
235a0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
235b0 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74 20 73  *.** Statement s
235c0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  ubtransactions a
235d0 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64 20 69  re used around i
235e0 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20 73 74  ndividual SQL st
235f0 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74  atements.** that
23600 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 77   are contained w
23610 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e  ithin a BEGIN...
23620 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49  COMMIT block.  I
23630 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  f a constraint.*
23640 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  * error occurs w
23650 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
23660 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63 74 20  ent, the effect 
23670 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74 61 74  of that one stat
23680 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20  ement.** can be 
23690 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69 74 68  rolled back with
236a0 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 72 6f  out having to ro
236b0 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74 69 72  llback the entir
236c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
236d0 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65 6e 74  *.** A statement
236e0 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69 6f 6e   sub-transaction
236f0 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
23700 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20  as an anonymous 
23710 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65 0a 2a  savepoint. The.*
23720 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61  * value passed a
23730 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72  s the second par
23740 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 74 6f  ameter is the to
23750 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 61  tal number of sa
23760 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63  vepoints,.** inc
23770 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77 20 61  luding the new a
23780 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
23790 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  nt, open on the 
237a0 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69 66 20  B-Tree. i.e. if 
237b0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
237c0 61 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74  active savepoint
237d0 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 73  s and no other s
237e0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
237f0 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69  tions open,.** i
23800 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31 2e 20  Statement is 1. 
23810 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73 20 73  This anonymous s
23820 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62 65 20  avepoint can be 
23830 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f 6c 6c  released or roll
23840 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67  ed back.** using
23850 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
23860 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66 75 6e  eSavepoint() fun
23870 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
23880 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53  lite3BtreeBeginS
23890 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  tmt(Btree *p, in
238a0 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b 0a 20  t iStatement){. 
238b0 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
238c0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
238d0 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
238e0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
238f0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  ert( p->inTrans=
23900 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
23910 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
23920 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
23930 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
23940 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65    assert( iState
23950 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 73 65  ment>0 );.  asse
23960 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 70  rt( iStatement>p
23970 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
23980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
23990 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
239a0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
239b0 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70 61 67  .  /* At the pag
239c0 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74 61 74  er level, a stat
239d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
239e0 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74  n is a savepoint
239f0 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20 69 6e   with.  ** an in
23a00 64 65 78 20 67 72 65 61 74 65 72 20 74 68 61 6e  dex greater than
23a10 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
23a20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63 69 74  created explicit
23a30 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20 53 51  ly using.  ** SQ
23a40 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74  L statements. It
23a50 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f   is illegal to o
23a60 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20  pen, release or 
23a70 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 2a  rollback any.  *
23a80 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e 74  * such savepoint
23a90 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61 74  s while the stat
23aa0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
23ab0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 61  n savepoint is a
23ac0 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  ctive..  */.  rc
23ad0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f   = sqlite3PagerO
23ae0 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74  penSavepoint(pBt
23af0 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74 65  ->pPager, iState
23b00 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ment);.  sqlite3
23b10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
23b20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23b30 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
23b40 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
23b50 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c 20 69   function, op, i
23b60 73 20 61 6c 77 61 79 73 20 53 41 56 45 50 4f 49  s always SAVEPOI
23b70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f  NT_ROLLBACK.** o
23b80 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  r SAVEPOINT_RELE
23b90 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ASE. This functi
23ba0 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65 61 73  on either releas
23bb0 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  es or rolls back
23bc0 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f 69 6e   the.** savepoin
23bd0 74 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  t identified by 
23be0 70 61 72 61 6d 65 74 65 72 20 69 53 61 76 65 70  parameter iSavep
23bf0 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e 67 20  oint, depending 
23c00 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a 2a 2a  on the value .**
23c10 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   of op..**.** No
23c20 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70 6f 69  rmally, iSavepoi
23c30 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
23c40 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
23c50 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ero. However, if
23c60 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45 50 4f   op is.** SAVEPO
23c70 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
23c80 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 6d 61  en iSavepoint ma
23c90 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20 49 6e  y also be -1. In
23ca0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 0a   this case the .
23cb0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
23cc0 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61  he entire transa
23cd0 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c 65 64  ction are rolled
23ce0 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20 64   back. This is d
23cf0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d  ifferent.** from
23d00 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e 73 61   a normal transa
23d10 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20  ction rollback, 
23d20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  as no locks are 
23d30 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74 68 65  released and the
23d40 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
23d50 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f  remains open..*/
23d60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23d70 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72 65 65  eSavepoint(Btree
23d80 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
23d90 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20   iSavepoint){.  
23da0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23db0 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70  OK;.  if( p && p
23dc0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
23dd0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
23de0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
23df0 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
23e00 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
23e10 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d 3d 53  RELEASE || op==S
23e20 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23e30 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
23e40 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30 20 7c   iSavepoint>=0 |
23e50 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d 3d 2d  | (iSavepoint==-
23e60 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49  1 && op==SAVEPOI
23e70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a  NT_ROLLBACK) );.
23e80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
23e90 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 69 66  Enter(p);.    if
23ea0 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  ( op==SAVEPOINT_
23eb0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
23ec0 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75    rc = saveAllCu
23ed0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
23ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23f00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23f10 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e  te3PagerSavepoin
23f20 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f  t(pBt->pPager, o
23f30 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  p, iSavepoint);.
23f40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
23f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23f60 20 20 20 20 20 69 66 28 20 69 53 61 76 65 70 6f       if( iSavepo
23f70 69 6e 74 3c 30 20 26 26 20 28 70 42 74 2d 3e 62  int<0 && (pBt->b
23f80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 49 4e  tsFlags & BTS_IN
23f90 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d  ITIALLY_EMPTY)!=
23fa0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  0 ){.        pBt
23fb0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->nPage = 0;.   
23fc0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
23fd0 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
23fe0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
23ff0 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  ge = get4byte(28
24000 20 2b 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e   + pBt->pPage1->
24010 61 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f  aData);..      /
24020 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 73  * The database s
24030 69 7a 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ize was written 
24040 69 6e 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  into the offset 
24050 32 38 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  28 of the header
24060 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20 74  .      ** when t
24070 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
24080 74 61 72 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e  tarted, so we kn
24090 6f 77 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  ow that the valu
240a0 65 20 61 74 20 6f 66 66 73 65 74 0a 20 20 20 20  e at offset.    
240b0 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65    ** 28 is nonze
240c0 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ro. */.      ass
240d0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e  ert( pBt->nPage>
240e0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  0 );.    }.    s
240f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
24100 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
24110 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
24120 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
24130 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
24140 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
24150 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
24160 61 62 6c 65 2e 20 49 66 20 61 20 72 65 61 64 2d  able. If a read-
24170 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69 73 20 72  only cursor is r
24180 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
24190 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
241a0 74 68 65 20 63 61 6c 6c 65 72 20 61 6c 72 65 61  the caller alrea
241b0 64 79 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  dy has at least 
241c0 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e  a read-only tran
241d0 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20  saction open.** 
241e0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
241f0 61 6c 72 65 61 64 79 2e 20 49 66 20 61 20 77 72  already. If a wr
24200 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 72 65  ite-cursor is re
24210 71 75 65 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a  quested, then.**
24220 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 61   the caller is a
24230 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20 61  ssumed to have a
24240 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
24250 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
24260 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
24270 53 52 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  SR bit of wrFlag
24280 20 69 73 20 63 6c 65 61 72 2c 20 74 68 65 6e 20   is clear, then 
24290 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
242a0 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65 64 20 66  nly.** be used f
242b0 6f 72 20 72 65 61 64 69 6e 67 2e 20 20 49 66 20  or reading.  If 
242c0 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
242d0 62 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 6e  bit is set, then
242e0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63   the cursor.** c
242f0 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  an be used for r
24300 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 20 77 72  eading or for wr
24310 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
24320 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
24330 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73  iting.** are als
24340 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 20 61 72  o met.  These ar
24350 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
24360 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
24370 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f  t in order.** fo
24380 72 20 77 72 69 74 69 6e 67 20 74 6f 20 62 65 20  r writing to be 
24390 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
243a0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
243b0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
243c0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 20  ned with wrFlag 
243d0 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54 52 45 45  containing BTREE
243e0 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20  _WRCSR.**.** 2: 
243f0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
24400 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
24410 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
24420 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
24430 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
24440 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
24450 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
24460 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
24470 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
24480 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
24490 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
244a0 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
244b0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
244c0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
244d0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
244e0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
244f0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
24500 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
24510 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
24520 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
24530 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
24540 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
24550 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
24560 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
24570 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
24580 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
24590 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
245a0 2a 20 54 68 65 20 42 54 52 45 45 5f 46 4f 52 44  * The BTREE_FORD
245b0 45 4c 45 54 45 20 62 69 74 20 6f 66 20 77 72 46  ELETE bit of wrF
245c0 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c  lag may optional
245d0 6c 79 20 62 65 20 73 65 74 20 69 66 20 42 54 52  ly be set if BTR
245e0 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69 73 20 73  EE_WRCSR.** is s
245f0 65 74 2e 20 20 49 66 20 46 4f 52 44 45 4c 45 54  et.  If FORDELET
24600 45 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 69  E is set, that i
24610 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20  s a hint to the 
24620 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
24630 68 61 74 0a 2a 2a 20 74 68 69 73 20 63 75 72 73  hat.** this curs
24640 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20  or will only be 
24650 75 73 65 64 20 74 6f 20 73 65 65 6b 20 74 6f 20  used to seek to 
24660 61 6e 64 20 64 65 6c 65 74 65 20 65 6e 74 72 69  and delete entri
24670 65 73 20 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a  es of an index.*
24680 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6c  * as part of a l
24690 61 72 67 65 72 20 44 45 4c 45 54 45 20 73 74 61  arger DELETE sta
246a0 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 46 4f 52  tement.  The FOR
246b0 44 45 4c 45 54 45 20 68 69 6e 74 20 69 73 20 6e  DELETE hint is n
246c0 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ot used by.** th
246d0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
246e0 6e 2e 20 20 42 75 74 20 69 6e 20 61 20 68 79 70  n.  But in a hyp
246f0 6f 74 68 65 74 69 63 61 6c 20 61 6c 74 65 72 6e  othetical altern
24700 61 74 69 76 65 20 73 74 6f 72 61 67 65 20 65 6e  ative storage en
24710 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63  gine .** in whic
24720 68 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  h index entries 
24730 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
24740 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 63  y deleted when c
24750 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
24760 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72 65 20 64  le.** rows are d
24770 65 6c 65 74 65 64 2c 20 74 68 65 20 46 4f 52 44  eleted, the FORD
24780 45 4c 45 54 45 20 66 6c 61 67 20 69 73 20 61 20  ELETE flag is a 
24790 68 69 6e 74 20 74 68 61 74 20 61 6c 6c 20 53 45  hint that all SE
247a0 45 4b 20 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a  EK and DELETE.**
247b0 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74   operations on t
247c0 68 69 73 20 63 75 72 73 6f 72 20 63 61 6e 20 62  his cursor can b
247d0 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c  e no-ops and all
247e0 20 52 45 41 44 20 6f 70 65 72 61 74 69 6f 6e 73   READ operations
247f0 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20   can .** return 
24800 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79  a null row (2-by
24810 74 65 73 3a 20 30 78 30 31 20 30 78 30 30 29 2e  tes: 0x01 0x00).
24820 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
24830 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
24840 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
24850 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
24860 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
24870 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
24880 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
24890 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
248a0 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
248b0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
248c0 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
248d0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
248e0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
248f0 72 73 6f 72 5a 65 72 6f 28 29 20 68 61 73 20 62  rsorZero() has b
24900 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e  een called.** on
24910 20 70 43 75 72 20 74 6f 20 69 6e 69 74 69 61 6c   pCur to initial
24920 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73  ize the memory s
24930 70 61 63 65 20 70 72 69 6f 72 20 74 6f 20 69 6e  pace prior to in
24940 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
24950 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
24960 6e 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a  nt btreeCursor(.
24970 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
249a0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
249b0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
249c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249d0 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
249e0 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
249f0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
24a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
24a20 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
24a30 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
24a40 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
24a50 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
24a60 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
24a70 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  to comparison fu
24a80 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75  nction */.  BtCu
24a90 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
24aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ab0 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
24ac0 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b  new cursor */.){
24ad0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
24ae0 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20 20 20 20   = p->pBt;      
24af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
24b00 72 65 64 20 62 2d 74 72 65 65 20 68 61 6e 64 6c  red b-tree handl
24b10 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
24b20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
24b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24b40 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74   Looping over ot
24b50 68 65 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  her all cursors 
24b60 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
24b70 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
24b80 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
24b90 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a  ert( wrFlag==0 .
24ba0 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67         || wrFlag
24bb0 3d 3d 42 54 52 45 45 5f 57 52 43 53 52 20 0a 20  ==BTREE_WRCSR . 
24bc0 20 20 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d        || wrFlag=
24bd0 3d 28 42 54 52 45 45 5f 57 52 43 53 52 7c 42 54  =(BTREE_WRCSR|BT
24be0 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a  REE_FORDELETE) .
24bf0 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66    );..  /* The f
24c00 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20  ollowing assert 
24c10 73 74 61 74 65 6d 65 6e 74 73 20 76 65 72 69 66  statements verif
24c20 79 20 74 68 61 74 20 69 66 20 74 68 69 73 20 69  y that if this i
24c30 73 20 61 20 73 68 61 72 61 62 6c 65 20 0a 20 20  s a sharable .  
24c40 2a 2a 20 62 2d 74 72 65 65 20 64 61 74 61 62 61  ** b-tree databa
24c50 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  se, the connecti
24c60 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  on is holding th
24c70 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c 65  e required table
24c80 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e   locks, .  ** an
24c90 64 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  d that no other 
24ca0 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 61  connection has a
24cb0 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 74  ny open cursor t
24cc0 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 20 77 69  hat conflicts wi
24cd0 74 68 20 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f  th .  ** this lo
24ce0 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ck.  */.  assert
24cf0 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
24d00 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
24d10 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30  ble, pKeyInfo!=0
24d20 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31 29 29 20  , (wrFlag?2:1)) 
24d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
24d40 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65  lag==0 || !hasRe
24d50 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69  adConflicts(p, i
24d60 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  Table) );..  /* 
24d70 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  Assert that the 
24d80 63 61 6c 6c 65 72 20 68 61 73 20 6f 70 65 6e 65  caller has opene
24d90 64 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  d the required t
24da0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
24db0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
24dc0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ans>TRANS_NONE )
24dd0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46 6c  ;.  assert( wrFl
24de0 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72  ag==0 || p->inTr
24df0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
24e00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
24e10 74 2d 3e 70 50 61 67 65 31 20 26 26 20 70 42 74  t->pPage1 && pBt
24e20 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
24e30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72 46  );.  assert( wrF
24e40 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e  lag==0 || (pBt->
24e50 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
24e60 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a  EAD_ONLY)==0 );.
24e70 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29 7b  .  if( wrFlag ){
24e80 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  .    allocateTem
24e90 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
24ea0 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70   if( pBt->pTmpSp
24eb0 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ace==0 ) return 
24ec0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
24ed0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  T;.  }.  if( iTa
24ee0 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
24ef0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
24f00 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24f10 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
24f20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
24f30 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
24f40 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
24f50 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
24f60 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
24f70 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
24f80 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
24f90 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
24fa0 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
24fb0 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
24fc0 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
24fd0 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
24fe0 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
24ff0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
25000 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
25010 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
25020 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
25030 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
25040 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
25050 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
25060 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
25070 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
25080 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
25090 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
250a0 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
250b0 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
250c0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
250d0 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
250e0 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
250f0 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
25100 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
25110 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
25120 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
25130 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
25140 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
25150 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
25160 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
25170 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
25180 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
25190 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
251a0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
251b0 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
251c0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
251d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
251e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
251f0 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
25200 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
25210 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
25220 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
25230 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
25240 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25270 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
25280 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252b0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
252c0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
252d0 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
252e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25300 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
25310 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
25320 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
25330 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
25340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25350 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
25360 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
25370 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
253a0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
253b0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
253c0 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
253d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
253e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
253f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
25400 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
25410 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
25420 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
25430 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
25440 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
25450 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
25460 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
25470 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
25480 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
25490 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
254a0 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
254b0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
254c0 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
254d0 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
254e0 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
254f0 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
25500 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
25510 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
25520 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
25530 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
25540 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
25550 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
25560 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
25570 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
25580 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
25590 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
255a0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
255b0 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
255c0 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
255d0 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
255e0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
255f0 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
25600 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
25610 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
25620 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
25630 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
25640 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
25650 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
25660 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
25670 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
25680 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
25690 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
256a0 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
256b0 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
256c0 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
256d0 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
256e0 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
256f0 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
25700 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
25710 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
25720 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
25730 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
25740 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
25750 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
25760 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
25770 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
25780 75 72 73 6f 72 2c 20 42 54 43 55 52 53 4f 52 5f  ursor, BTCURSOR_
25790 46 49 52 53 54 5f 55 4e 49 4e 49 54 29 29 3b 0a  FIRST_UNINIT));.
257a0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
257b0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
257c0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
257d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
257e0 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
257f0 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
25800 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
25810 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
25820 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
25830 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
25840 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
25850 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
25860 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
25870 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
25880 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
25890 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
258a0 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
258b0 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73  sert( pBt->pCurs
258c0 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  or!=0 );.    if(
258d0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70   pBt->pCursor==p
258e0 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74  Cur ){.      pBt
258f0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
25900 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
25910 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73  se{.      BtCurs
25920 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d  or *pPrev = pBt-
25930 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >pCursor;.      
25940 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
25950 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43  pPrev->pNext==pC
25960 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ur ){.          
25970 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
25980 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
25990 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
259a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
259b0 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e  Prev = pPrev->pN
259c0 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  ext;.      }whil
259d0 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76 29  e( ALWAYS(pPrev)
259e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74   );.    }.    bt
259f0 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
25a00 73 6f 72 50 61 67 65 73 28 70 43 75 72 29 3b 0a  sorPages(pCur);.
25a10 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
25a20 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
25a30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
25a40 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b  Cur->aOverflow);
25a50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25a60 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
25a70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
25a80 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
25a90 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
25aa0 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
25ab0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
25ac0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
25ad0 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76  he BtCursor* giv
25ae0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
25af0 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a  nt has a valid.*
25b00 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20  * BtCursor.info 
25b10 73 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69  structure.  If i
25b20 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
25b30 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20   valid, call.** 
25b40 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  btreeParseCell()
25b50 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
25b60 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
25b70 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
25b80 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
25b90 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
25ba0 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
25bb0 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
25bc0 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
25bd0 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50   calls to btreeP
25be0 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23  arseCell()..*/.#
25bf0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
25c00 73 74 61 74 69 63 20 69 6e 74 20 63 65 6c 6c 49  static int cellI
25c10 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c 49 6e 66  nfoEqual(CellInf
25c20 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66 6f 20 2a  o *a, CellInfo *
25c30 62 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e  b){.    if( a->n
25c40 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20 29 20 72  Key!=b->nKey ) r
25c50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
25c60 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21 3d 62 2d   a->pPayload!=b-
25c70 3e 70 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75  >pPayload ) retu
25c80 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
25c90 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d 3e 6e 50  >nPayload!=b->nP
25ca0 61 79 6c 6f 61 64 20 29 20 72 65 74 75 72 6e 20  ayload ) return 
25cb0 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 4c  0;.    if( a->nL
25cc0 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63 61 6c 20  ocal!=b->nLocal 
25cd0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25ce0 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21 3d 62 2d  if( a->nSize!=b-
25cf0 3e 6e 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20  >nSize ) return 
25d00 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  0;.    return 1;
25d10 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76 6f  .  }.  static vo
25d20 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
25d30 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
25d40 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
25d50 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74  info;.    memset
25d60 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  (&info, 0, sizeo
25d70 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74  f(info));.    bt
25d80 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
25d90 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
25da0 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ix, &info);.    
25db0 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
25dc0 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66 6f 45 71  DB || cellInfoEq
25dd0 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  ual(&info, &pCur
25de0 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20 7d 0a 23  ->info) );.  }.#
25df0 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
25e00 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
25e10 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53  .#endif.static S
25e20 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
25e30 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
25e40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25e50 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
25e60 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
25e70 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
25e80 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b   |= BTCF_ValidNK
25e90 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ey;.    btreePar
25ea0 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
25eb0 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26 70 43 75  ge,pCur->ix,&pCu
25ec0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
25ed0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
25ee0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
25ef0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
25f00 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
25f10 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
25f20 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
25f30 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
25f40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
25f50 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
25f60 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
25f70 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
25f80 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
25f90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
25fa0 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
25fb0 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
25fc0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
25fd0 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
25fe0 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
25ff0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
26000 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
26010 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
26020 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
26030 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
26040 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
26050 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
26060 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
26070 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
26080 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73 71 6c 69  EBUG */.int sqli
26090 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
260a0 56 61 6c 69 64 4e 4e 28 42 74 43 75 72 73 6f 72  ValidNN(BtCursor
260b0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
260c0 74 28 20 70 43 75 72 21 3d 30 20 29 3b 0a 20 20  t( pCur!=0 );.  
260d0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 65 53 74  return pCur->eSt
260e0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
260f0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
26100 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
26110 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
26120 6f 72 20 22 72 6f 77 69 64 22 20 66 6f 72 20 61  or "rowid" for a
26130 20 74 61 62 6c 65 20 62 74 72 65 65 2e 0a 2a 2a   table btree..**
26140 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
26150 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20   only valid for 
26160 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
26170 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 61   pointing into a
26180 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20 74 61 62  .** ordinary tab
26190 6c 65 20 62 74 72 65 65 2e 20 20 49 66 20 74 68  le btree.  If th
261a0 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20  e cursor points 
261b0 74 6f 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  to an index btre
261c0 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e 76 61 6c  e or.** is inval
261d0 69 64 2c 20 74 68 65 20 72 65 73 75 6c 74 20 6f  id, the result o
261e0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
261f0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
26200 69 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65  i64 sqlite3Btree
26210 49 6e 74 65 67 65 72 4b 65 79 28 42 74 43 75 72  IntegerKey(BtCur
26220 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
26230 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26240 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26250 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26260 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26270 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
26280 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
26290 79 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  y );.  getCellIn
262a0 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  fo(pCur);.  retu
262b0 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  rn pCur->info.nK
262c0 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ey;.}..#ifdef SQ
262d0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46 53  LITE_ENABLE_OFFS
262e0 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f 2a 0a 2a  ET_SQL_FUNC./*.*
262f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
26300 73 65 74 20 69 6e 74 6f 20 74 68 65 20 64 61 74  set into the dat
26310 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
26320 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
26330 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f 20 77 68  ** payload to wh
26340 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69  ich the cursor i
26350 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2f 0a 69  s pointing..*/.i
26360 36 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  64 sqlite3BtreeO
26370 66 66 73 65 74 28 42 74 43 75 72 73 6f 72 20 2a  ffset(BtCursor *
26380 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
26390 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
263a0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
263b0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
263c0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
263d0 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
263e0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
263f0 20 28 69 36 34 29 70 43 75 72 2d 3e 70 42 74 2d   (i64)pCur->pBt-
26400 3e 70 61 67 65 53 69 7a 65 2a 28 28 69 36 34 29  >pageSize*((i64)
26410 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e  pCur->pPage->pgn
26420 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20 20 20 20  o - 1) +.       
26430 20 20 28 69 36 34 29 28 70 43 75 72 2d 3e 69 6e    (i64)(pCur->in
26440 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70 43  fo.pPayload - pC
26450 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61  ur->pPage->aData
26460 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
26470 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f 46 46  QLITE_ENABLE_OFF
26480 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20 2a 2f 0a  SET_SQL_FUNC */.
26490 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
264a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
264b0 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66 6f 72  s of payload for
264c0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
264d0 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72 72 65  pCur is.** curre
264e0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ntly pointing to
264f0 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62 74 72  .  For table btr
26500 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
26510 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20  e the amount.** 
26520 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20 69 6e  of data.  For in
26530 64 65 78 20 62 74 72 65 65 73 2c 20 74 68 69 73  dex btrees, this
26540 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73 69 7a   will be the siz
26550 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  e of the key..**
26560 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  .** The caller m
26570 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74 68  ust guarantee th
26580 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
26590 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 6e   pointing to a n
265a0 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64  on-NULL.** valid
265b0 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68 65   entry.  In othe
265c0 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61 6c  r words, the cal
265d0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 6d  ling procedure m
265e0 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a 2a  ust guarantee.**
265f0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
26600 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74 61   has Cursor.eSta
26610 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
26620 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
26630 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
26640 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26650 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26660 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26670 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26680 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26690 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
266a0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
266b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
266c0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b  ->info.nPayload;
266d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
266e0 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 20   an upper bound 
266f0 6f 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  on the size of a
26700 6e 79 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68  ny record for th
26710 65 20 74 61 62 6c 65 0a 2a 2a 20 74 68 61 74 20  e table.** that 
26720 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f  the cursor is po
26730 69 6e 74 69 6e 67 20 69 6e 74 6f 2e 0a 2a 2a 0a  inting into..**.
26740 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  ** This is an op
26750 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 45 76 65  timization.  Eve
26760 72 79 74 68 69 6e 67 20 77 69 6c 6c 20 73 74 69  rything will sti
26770 6c 6c 20 77 6f 72 6b 20 69 66 20 74 68 69 73 0a  ll work if this.
26780 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79  ** routine alway
26790 73 20 72 65 74 75 72 6e 73 20 32 31 34 37 34 38  s returns 214748
267a0 33 36 34 37 20 28 77 68 69 63 68 20 69 73 20 74  3647 (which is t
267b0 68 65 20 6c 61 72 67 65 73 74 20 72 65 63 6f 72  he largest recor
267c0 64 0a 2a 2a 20 74 68 61 74 20 53 51 4c 69 74 65  d.** that SQLite
267d0 20 63 61 6e 20 68 61 6e 64 6c 65 29 20 6f 72 20   can handle) or 
267e0 6d 6f 72 65 2e 20 20 42 75 74 20 72 65 74 75 72  more.  But retur
267f0 6e 69 6e 67 20 61 20 73 6d 61 6c 6c 65 72 20 76  ning a smaller v
26800 61 6c 75 65 20 6d 69 67 68 74 0a 2a 2a 20 70 72  alue might.** pr
26810 65 76 65 6e 74 20 6c 61 72 67 65 20 6d 65 6d 6f  event large memo
26820 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77  ry allocations w
26830 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 69 6e  hen trying to in
26840 74 65 72 70 72 65 74 20 61 0a 2a 2a 20 63 6f 72  terpret a.** cor
26850 72 75 70 74 20 64 61 74 72 61 62 61 73 65 2e 0a  rupt datrabase..
26860 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e  **.** The curren
26870 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
26880 20 6d 65 72 65 6c 79 20 72 65 74 75 72 6e 73 20   merely returns 
26890 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
268a0 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 64 61  underlying.** da
268b0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
268c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
268d0 6c 69 74 65 33 42 74 72 65 65 4d 61 78 52 65 63  lite3BtreeMaxRec
268e0 6f 72 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72  ordSize(BtCursor
268f0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
26900 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
26910 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
26920 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
26930 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
26940 44 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  D );.  return pC
26950 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ur->pBt->pageSiz
26960 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
26970 36 34 29 70 43 75 72 2d 3e 70 42 74 2d 3e 6e 50  64)pCur->pBt->nP
26980 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  age;.}../*.** Gi
26990 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
269a0 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
269b0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
269c0 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
269d0 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
269e0 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
269f0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
26a00 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
26a10 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
26a20 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
26a30 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
26a40 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
26a50 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
26a60 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
26a70 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
26a80 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
26a90 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
26aa0 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
26ab0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
26ac0 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
26ad0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
26ae0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
26af0 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
26b00 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
26b10 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
26b20 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
26b30 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
26b40 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
26b50 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
26b60 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
26b70 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
26b80 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
26b90 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
26ba0 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
26bb0 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
26bc0 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
26bd0 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
26be0 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
26bf0 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
26c00 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
26c10 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
26c20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
26c30 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
26c40 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
26c50 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
26c60 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
26c70 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
26c80 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
26c90 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
26ca0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
26cb0 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
26cc0 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
26cd0 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
26ce0 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
26cf0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
26d00 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
26d10 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
26d20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
26d30 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
26d40 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
26d50 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
26d60 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
26d70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
26d80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
26d90 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26db0 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77  Current overflow
26dc0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
26dd0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
26de0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ge,            /
26df0 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68  * OUT: MemPage h
26e00 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55  andle (may be NU
26e10 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  LL) */.  Pgno *p
26e20 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20  PgnoNext        
26e30 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
26e40 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
26e50 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20   number */.){.  
26e60 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20  Pgno next = 0;. 
26e70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
26e80 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
26e90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
26ea0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
26eb0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
26ec0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
26ed0 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69  (pPgnoNext);..#i
26ee0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
26ef0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
26f00 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
26f10 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
26f20 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
26f30 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
26f40 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
26f50 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
26f60 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
26f70 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
26f80 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
26f90 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
26fa0 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
26fb0 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
26fc0 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
26fd0 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
26fe0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
26ff0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
27000 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
27010 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
27020 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
27030 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
27040 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
27050 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
27060 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
27070 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
27080 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
27090 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
270a0 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
270b0 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
270c0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
270d0 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
270e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
270f0 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61   iGuess<=btreePa
27100 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
27110 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
27120 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
27130 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
27140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
27150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79  SQLITE_OK && eTy
27160 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
27170 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76  LOW2 && pgno==ov
27180 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  fl ){.        ne
27190 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20  xt = iGuess;.   
271a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
271b0 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _DONE;.      }. 
271c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
271d0 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d  .  assert( next=
271e0 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  =0 || rc==SQLITE
271f0 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
27200 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27210 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
27220 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
27230 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65   &pPage, (ppPage
27240 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54  ==0) ? PAGER_GET
27250 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a  _READONLY : 0);.
27260 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
27270 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
27280 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ge==0 );.    if(
27290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
272a0 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  {.      next = g
272b0 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
272c0 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Data);.    }.  }
272d0 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  ..  *pPgnoNext =
272e0 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50   next;.  if( ppP
272f0 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61  age ){.    *ppPa
27300 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65  ge = pPage;.  }e
27310 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
27320 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d  Page(pPage);.  }
27330 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
27340 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c  QLITE_DONE ? SQL
27350 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a  ITE_OK : rc);.}.
27360 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61  ./*.** Copy data
27370 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74   from a buffer t
27380 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f  o a page, or fro
27390 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75  m a page to a bu
273a0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79  ffer..**.** pPay
273b0 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65  load is a pointe
273c0 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64  r to data stored
273d0 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67   on database pag
273e0 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66  e pDbPage..** If
273f0 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73   argument eOp is
27400 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79   false, then nBy
27410 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  te bytes of data
27420 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66   are copied.** f
27430 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20  rom pPayload to 
27440 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
27450 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49  ed at by pBuf. I
27460 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a  f eOp is true,.*
27470 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61  * then sqlite3Pa
27480 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
27490 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20  lled on pDbPage 
274a0 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a  and nByte bytes.
274b0 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  ** of data are c
274c0 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62  opied from the b
274d0 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50  uffer pBuf to pP
274e0 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ayload..**.** SQ
274f0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
27500 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ned on success, 
27510 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72  otherwise an err
27520 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
27530 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f  ic int copyPaylo
27540 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79  ad(.  void *pPay
27550 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  load,           
27560 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61  /* Pointer to pa
27570 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ge data */.  voi
27580 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
27590 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
275a0 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20  r to buffer */. 
275b0 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
275c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
275d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
275e0 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65   copy */.  int e
275f0 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Op,             
27600 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70       /* 0 -> cop
27610 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d  y from page, 1 -
27620 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a  > copy to page *
27630 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  /.  DbPage *pDbP
27640 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  age           /*
27650 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
27660 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a   pPayload */.){.
27670 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20    if( eOp ){.   
27680 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
27690 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67  om buffer to pag
276a0 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61  e (a write opera
276b0 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74  tion) */.    int
276c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
276d0 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
276e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
276f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27700 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
27710 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61  }.    memcpy(pPa
27720 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79  yload, pBuf, nBy
27730 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  te);.  }else{.  
27740 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
27750 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66  rom page to buff
27760 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61  er (a read opera
27770 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d  tion) */.    mem
27780 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f  cpy(pBuf, pPaylo
27790 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a  ad, nByte);.  }.
277a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
277b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
277c0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
277d0 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76  ed to read or ov
277e0 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20  erwrite payload 
277f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66  information.** f
27800 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
27810 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f  t the pCur curso
27820 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
27830 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67  . The eOp.** arg
27840 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72  ument is interpr
27850 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  eted as follows:
27860 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20  .**.**   0: The 
27870 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72  operation is a r
27880 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ead. Populate th
27890 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
278a0 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70  ..**   1: The op
278b0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69  eration is a wri
278c0 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  te. Populate the
278d0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
278e0 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
278f0 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
27900 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
27910 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
27920 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
27930 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
27940 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
27950 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  Buf..**.** The c
27960 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61  ontent being rea
27970 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67  d or written mig
27980 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65  ht appear on the
27990 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72   main page.** or
279a0 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75   be scattered ou
279b0 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76  t on multiple ov
279c0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a  erflow pages..**
279d0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
279e0 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20  nt cursor entry 
279f0 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  uses one or more
27a00 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
27a10 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
27a20 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
27a30 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
27a40 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74  ly populate.** t
27a50 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
27a60 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61  -list cache arra
27a70 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  y (BtCursor.aOve
27a80 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73  rflow). .** Subs
27a90 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65  equent calls use
27aa0 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d   this cache to m
27ab0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
27ac0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
27ad0 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69  et .** more effi
27ae0 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
27af0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
27b00 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
27b10 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
27b20 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20  , it must be.** 
27b30 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73  invalidated if s
27b40 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72  ome other cursor
27b50 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73   writes to the s
27b60 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66  ame table, or if
27b70 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69  .** the cursor i
27b80 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66  s moved to a dif
27b90 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69  ferent row. Addi
27ba0 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74  tionally, in aut
27bb0 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65  o-vacuum.** mode
27bc0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
27bd0 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c  events may inval
27be0 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f  idate an overflo
27bf0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
27c00 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20  e..**.**   * An 
27c10 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
27c20 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d  um,.**   * A com
27c30 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75  mit in auto_vacu
27c40 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a  um="full" mode,.
27c50 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20  **   * Creating 
27c60 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71  a table (may req
27c70 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f  uire moving an o
27c80 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a  verflow page)..*
27c90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63  /.static int acc
27ca0 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  essPayload(.  Bt
27cb0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
27cc0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
27cd0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
27ce0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
27cf0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20   u32 offset,    
27d00 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72        /* Begin r
27d10 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20  eading this far 
27d20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  into payload */.
27d30 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20    u32 amt,      
27d40 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74         /* Read t
27d50 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a  his many bytes *
27d60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
27d70 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74  r *pBuf, /* Writ
27d80 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f  e the bytes into
27d90 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20   this buffer */ 
27da0 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20  .  int eOp      
27db0 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20          /* zero 
27dc0 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72  to read. non-zer
27dd0 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29  o to write. */.)
27de0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
27df0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69  r *aPayload;.  i
27e00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
27e10 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  K;.  int iIdx = 
27e20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
27e30 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
27e40 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27e50 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
27e60 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  f current entry 
27e70 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
27e80 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20  Bt = pCur->pBt; 
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
27eb0 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
27ec0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
27ed0 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
27ee0 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65  W_READ.  unsigne
27ef0 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70  d char * const p
27f00 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b  BufStart = pBuf;
27f10 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66       /* Start of
27f20 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75   original out bu
27f30 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ffer */.#endif..
27f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
27f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  );.  assert( eOp
27f60 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b  ==0 || eOp==1 );
27f70 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27f80 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27f90 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
27fa0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67  t( pCur->ix<pPag
27fb0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
27fc0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
27fd0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
27fe0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
27ff0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
28000 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
28010 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74  ayload;.  assert
28020 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
28030 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
28040 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  oad );..  assert
28050 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61  ( aPayload > pPa
28060 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69  ge->aData );.  i
28070 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f  f( (uptr)(aPaylo
28080 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74  ad - pPage->aDat
28090 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c  a) > (pBt->usabl
280a0 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e  eSize - pCur->in
280b0 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20  fo.nLocal) ){.  
280c0 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
280d0 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
280e0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
280f0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
28100 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63  r.  The.    ** c
28110 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65  onditional above
28120 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20   is really:.    
28130 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b  **    &aPayload[
28140 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
28150 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
28160 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
28170 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69  ze].    ** but i
28180 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74  s recast into it
28190 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74  s current form t
281a0 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20  o avoid integer 
281b0 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d  overflow problem
281c0 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  s.    */.    ret
281d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
281e0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
281f0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
28200 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
28210 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
28220 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
28230 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
28240 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
28250 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
28260 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
28270 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
28280 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
28290 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
282a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
282b0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
282c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
282d0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
282e0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
282f0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
28300 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
28310 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
28320 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
28330 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
28340 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
28350 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28360 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63  ;.  }...  if( rc
28370 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
28380 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
28390 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
283a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
283b0 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
283c0 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
283d0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
283e0 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
283f0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
28400 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
28410 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
28420 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  ]);..    /* If t
28430 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
28440 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20  rflow[] has not 
28450 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20  been allocated, 
28460 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e  allocate it now.
28470 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
28480 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
28490 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
284a0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
284b0 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
284c0 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
284d0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
284e0 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
284f0 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
28500 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
28510 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
28520 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
28530 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
28540 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
28550 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
28560 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
28570 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
28580 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
28590 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
285a0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
285b0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
285c0 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20  dOvfl)==0 ){.   
285d0 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28     int nOvfl = (
285e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
285f0 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad-pCur->info.n
28600 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31  Local+ovflSize-1
28610 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  )/ovflSize;.    
28620 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
28630 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20  rflow==0.       
28640 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69  || nOvfl*(int)si
28650 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c  zeof(Pgno) > sql
28660 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70  ite3MallocSize(p
28670 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a  Cur->aOverflow).
28680 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28690 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50   Pgno *aNew = (P
286a0 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  gno*)sqlite3Real
286b0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20  loc(.           
286c0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
286d0 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66  , nOvfl*2*sizeof
286e0 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  (Pgno).        )
286f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e  ;.        if( aN
28700 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
28710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28720 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
28730 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28740 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
28750 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
28760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28770 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75        memset(pCu
28780 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c  r->aOverflow, 0,
28790 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67   nOvfl*sizeof(Pg
287a0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72  no));.      pCur
287b0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
287c0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20  CF_ValidOvfl;.  
287d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
287e0 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f  * If the overflo
287f0 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
28800 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
28810 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20  ated and the.   
28820 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
28830 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
28840 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
28850 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
28860 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
28870 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a  y to it..      *
28880 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  /.      if( pCur
28890 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
288a0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
288b0 20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28          iIdx = (
288c0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
288d0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61  ;.        nextPa
288e0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
288f0 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
28900 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66      offset = (of
28910 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset%ovflSize);.
28920 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
28930 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
28940 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
28950 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 );.    while( 
28960 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20  nextPage ){.    
28970 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
28980 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
28990 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
289a0 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
289b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
289c0 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
289d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
289e0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
289f0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
28a00 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
28a10 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
28a20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
28a30 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d  Overflow[iIdx] =
28a40 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
28a50 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76    if( offset>=ov
28a60 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
28a70 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65    /* The only re
28a80 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69  ason to read thi
28a90 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74  s page is to obt
28aa0 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20  ain the page.   
28ab0 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66       ** number f
28ac0 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  or the next page
28ad0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
28ae0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
28af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
28b00 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
28b10 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74  . So first try t
28b20 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65  o lookup the ove
28b30 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a  rflow.        **
28b40 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
28b50 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66  , if any, then f
28b60 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20  all back to the 
28b70 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28  getOverflowPage(
28b80 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e  ).        ** fun
28b90 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  ction..        *
28ba0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
28bb0 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
28bc0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
28bd0 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
28be0 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
28bf0 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
28c00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
28c10 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28c20 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
28c30 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
28c40 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28c50 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
28c60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
28c70 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
28c80 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
28c90 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
28ca0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
28cb0 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
28cc0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
28cd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
28ce0 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
28cf0 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
28d00 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
28d10 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
28d20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
28d30 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
28d40 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
28d50 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
28d60 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
28d70 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
28d80 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  mt;.        if( 
28d90 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66  a + offset > ovf
28da0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
28db0 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
28dc0 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
28dd0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
28de0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
28df0 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20  OW_READ.        
28e00 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f  /* If all the fo
28e10 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65  llowing are true
28e20 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  :.        **.   
28e30 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69       **   1) thi
28e40 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72  s is a read oper
28e50 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20  ation, and .    
28e60 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61      **   2) data
28e70 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f   is required fro
28e80 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  m the start of t
28e90 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  his overflow pag
28ea0 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  e, and.        *
28eb0 2a 20 20 20 33 29 20 74 68 65 72 65 20 61 72 65  *   3) there are
28ec0 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20   no dirty pages 
28ed0 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
28ee0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34  e.        **   4
28ef0 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
28f00 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
28f10 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
28f20 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  5) the page is n
28f30 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69  ot in the WAL fi
28f40 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  le.        **   
28f50 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  6) at least 4 by
28f60 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  tes have already
28f70 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20   been read into 
28f80 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
28f90 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  r .        **.  
28fa0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61        ** then da
28fb0 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64  ta can be read d
28fc0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
28fd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
28fe0 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20  nto the.        
28ff0 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  ** output buffer
29000 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
29010 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67  page-cache altog
29020 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65  ether. This spee
29030 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70  ds.        ** up
29040 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72   loading large r
29050 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e  ecords that span
29060 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70   many overflow p
29070 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ages..        */
29080 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70  .        if( eOp
29090 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20  /* (1) */.      
290d0 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20     && offset==0 
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20           /* (2) 
29110 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  */.         && s
29120 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 65 63  qlite3PagerDirec
29130 74 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50 61  tReadOk(pBt->pPa
29140 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20  ger, nextPage)  
29150 20 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f 0a    /* (3,4,5) */.
29160 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75           && &pBu
29170 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74  f[-4]>=pBufStart
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
291a0 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (6) */.       
291b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
291c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
291d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
291e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
291f0 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61            u8 aSa
29200 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20  ve[4];.         
29210 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70   u8 *aWrite = &p
29220 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20  Buf[-4];.       
29230 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74     assert( aWrit
29240 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20  e>=pBufStart ); 
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74          /* due t
29270 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20  o (6) */.       
29280 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c     memcpy(aSave,
29290 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20   aWrite, 4);.   
292a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
292b0 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57  te3OsRead(fd, aW
292c0 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29  rite, a+4, (i64)
292d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e  pBt->pageSize*(n
292e0 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20  extPage-1));.   
292f0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
29300 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74  = get4byte(aWrit
29310 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  e);.          me
29320 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61  mcpy(aWrite, aSa
29330 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  ve, 4);.        
29340 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
29350 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
29360 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
29370 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e;.          rc 
29380 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
29390 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e  t(pBt->pPager, n
293a0 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67  extPage, &pDbPag
293b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
293c0 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52   (eOp==0 ? PAGER
293d0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
293e0 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
293f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
29400 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29410 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
29420 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
29430 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
29440 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
29450 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
29460 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
29470 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
29480 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
29490 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
294a0 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70   pBuf, a, eOp, p
294b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
294c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
294d0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
294e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66  .            off
294f0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  set = 0;.       
29500 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29510 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b         amt -= a;
29520 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74  .        if( amt
29530 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  ==0 ) return rc;
29540 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d  .        pBuf +=
29550 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   a;.      }.    
29560 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
29570 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a  ;.      iIdx++;.
29580 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
29590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
295a0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f  & amt>0 ){.    /
295b0 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  * Overflow chain
295c0 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c   ends prematurel
295d0 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
295e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
295f0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
29600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29610 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
29620 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66  of the payload f
29630 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68  or the row at wh
29640 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20  ich that cursor 
29650 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c  pCur is currentl
29660 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20  y.** pointing.  
29670 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
29680 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20   be transferred 
29690 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
296a0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
296b0 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
296c0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e  ..**.** pCur can
296d0 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   be pointing to 
296e0 65 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f  either a table o
296f0 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  r an index b-tre
29700 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e  e..** If pointin
29710 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72  g to a table btr
29720 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  ee, then the con
29730 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20  tent section is 
29740 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75  read.  If.** pCu
29750 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
29760 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
29770 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65   then the key se
29780 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a  ction is read..*
29790 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33  *.** For sqlite3
297a0 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20  BtreePayload(), 
297b0 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
297c0 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72  ensure that pCur
297d0 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20   is pointing.** 
297e0 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69  to a valid row i
297f0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f  n the table.  Fo
29800 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
29810 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20  yloadChecked(), 
29820 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69  the.** cursor mi
29830 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f  ght be invalid o
29840 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  r might need to 
29850 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f  be restored befo
29860 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a  re being read..*
29870 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
29880 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
29890 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
298a0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
298b0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
298c0 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
298d0 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
298e0 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
298f0 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
29900 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
29910 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
29920 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20  ayload(BtCursor 
29930 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
29940 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
29950 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72   *pBuf){.  asser
29960 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
29970 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
29980 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29990 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
299a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
299b0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
299c0 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a   pCur->pPage );.
299d0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
299e0 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  ix<pCur->pPage->
299f0 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72  nCell );.  retur
29a00 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
29a10 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
29a20 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
29a30 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a  r*)pBuf, 0);.}..
29a40 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61  /*.** This varia
29a50 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  nt of sqlite3Btr
29a60 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b  eePayload() work
29a70 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75  s even if the cu
29a80 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  rsor has not.** 
29a90 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41  in the CURSOR_VA
29aa0 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69  LID state.  It i
29ab0 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74  s only used by t
29ac0 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  he sqlite3_blob_
29ad0 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66  read().** interf
29ae0 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ace..*/.#ifndef 
29af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
29b00 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49  BLOB.static SQLI
29b10 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
29b20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65  accessPayloadChe
29b30 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
29b40 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66   *pCur,.  u32 of
29b50 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c  fset,.  u32 amt,
29b60 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b  .  void *pBuf.){
29b70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20  .  int rc;.  if 
29b80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29b90 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
29ba0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
29bb0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20  ITE_ABORT;.  }. 
29bc0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
29bd0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
29be0 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  ) );.  rc = btre
29bf0 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
29c00 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
29c10 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a  return rc ? rc :
29c20 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29c30 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29c40 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e  , pBuf, 0);.}.in
29c50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
29c60 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43  yloadChecked(BtC
29c70 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
29c80 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
29c90 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
29ca0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29cb0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
29cc0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  ){.    assert( c
29cd0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
29ce0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72  d(pCur) );.    r
29cf0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
29d00 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
29d10 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
29d20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
29d30 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
29d40 61 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20  adChecked(pCur, 
29d50 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
29d60 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  f);.  }.}.#endif
29d70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
29d80 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a  INCRBLOB */../*.
29d90 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
29da0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
29db0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
29dc0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
29dd0 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
29de0 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
29df0 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
29e00 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
29e10 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
29e20 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
29e30 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
29e40 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
29e50 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
29e60 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
29e70 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
29e80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
29e90 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
29ea0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
29eb0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
29ec0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
29ed0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
29ee0 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
29ef0 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
29f00 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
29f10 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
29f20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
29f30 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
29f40 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
29f50 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
29f60 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
29f70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
29f80 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
29f90 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
29fa0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
29fb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
29fc0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
29fd0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
29fe0 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
29ff0 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
2a000 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
2a010 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
2a020 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
2a030 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
2a040 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
2a050 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
2a060 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
2a070 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
2a080 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
2a090 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
2a0a0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
2a0b0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
2a0c0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
2a0d0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
2a0e0 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
2a0f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
2a100 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
2a110 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
2a120 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
2a130 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
2a140 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
2a150 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
2a160 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
2a170 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
2a180 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
2a190 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
2a1a0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
2a1b0 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
2a1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
2a1d0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
2a1e0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
2a1f0 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  s here */.){.  i
2a200 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  nt amt;.  assert
2a210 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
2a220 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
2a230 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61  Cur->pPage);.  a
2a240 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a250 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a260 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
2a270 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2a280 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2a290 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2a2a0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2a2b0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2a2c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2a2d0 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61  ur->ix<pCur->pPa
2a2e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
2a2f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a300 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61  o.nSize>0 );.  a
2a310 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
2a320 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d  o.pPayload>pCur-
2a330 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  >pPage->aData ||
2a340 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
2a350 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a360 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75  nfo.pPayload<pCu
2a370 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
2a380 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29  nd ||CORRUPT_DB)
2a390 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  ;.  amt = pCur->
2a3a0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69  info.nLocal;.  i
2a3b0 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75  f( amt>(int)(pCu
2a3c0 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45  r->pPage->aDataE
2a3d0 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  nd - pCur->info.
2a3e0 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20  pPayload) ){.   
2a3f0 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f   /* There is too
2a400 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e   little space on
2a410 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 74 68   the page for th
2a420 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e  e expected amoun
2a430 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61  t.    ** of loca
2a440 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62  l content. Datab
2a450 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  ase must be corr
2a460 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  upt. */.    asse
2a470 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  rt( CORRUPT_DB )
2a480 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28  ;.    amt = MAX(
2a490 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70  0, (int)(pCur->p
2a4a0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d  Page->aDataEnd -
2a4b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
2a4c0 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  load));.  }.  *p
2a4d0 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a  Amt = (u32)amt;.
2a4e0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29    return (void*)
2a4f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a500 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  oad;.}.../*.** F
2a510 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
2a520 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
2a530 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72   point to, retur
2a540 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74  n as.** many byt
2a550 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72  es of the key or
2a560 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61   data as are ava
2a570 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f  ilable on the lo
2a580 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  cal.** b-tree pa
2a590 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  ge.  Write the n
2a5a0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
2a5b0 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70  le bytes into *p
2a5c0 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  Amt..**.** The p
2a5d0 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
2a5e0 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54  is ephemeral.  T
2a5f0 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20  he key/data may 
2a600 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65  move.** or be de
2a610 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e  stroyed on the n
2a620 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20  ext call to any 
2a630 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a  Btree routine,.*
2a640 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c  * including call
2a650 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72  s from other thr
2a660 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65  eads against the
2a670 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20   same cache..** 
2a680 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f  Hence, a mutex o
2a690 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73  n the BtShared s
2a6a0 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72  hould be held pr
2a6b0 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a  ior to calling.*
2a6c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
2a6d0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74  **.** These rout
2a6e0 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20  ines is used to 
2a6f0 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73  get quick access
2a700 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61   to key and data
2a710 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  .** in the commo
2a720 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20  n case where no 
2a730 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
2a740 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73  re used..*/.cons
2a750 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42  t void *sqlite3B
2a760 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68  treePayloadFetch
2a770 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2a780 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
2a790 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
2a7a0 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
2a7b0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
2a7c0 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74  he cursor down t
2a7d0 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2a7e0 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f  ge.  The newPgno
2a7f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
2a800 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20  .** page number 
2a810 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  of the child pag
2a820 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a  e to move to..**
2a830 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a840 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
2a850 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20  _CORRUPT if the 
2a860 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67  page-header flag
2a870 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68  s field of.** th
2a880 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2a890 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
2a8a0 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20  the flags field 
2a8b0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69  of the parent (i
2a8c0 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74  .e..** if an int
2a8d0 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73  key page appears
2a8e0 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e   to be the paren
2a8f0 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65  t of a non-intke
2a900 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69  y page, or.** vi
2a910 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74  ce-versa)..*/.st
2a920 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
2a930 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
2a940 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
2a950 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
2a960 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
2a970 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2a980 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2a990 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2a9a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2a9b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2a9c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2a9d0 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41  Page<BTCURSOR_MA
2a9e0 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  X_DEPTH );.  ass
2a9f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
2aa00 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  >=0 );.  if( pCu
2aa10 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52  r->iPage>=(BTCUR
2aa20 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29  SOR_MAX_DEPTH-1)
2aa30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2aa40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2aa50 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  PT;.  }.  pCur->
2aa60 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2aa70 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2aa80 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
2aa90 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2aaa0 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69  vfl);.  pCur->ai
2aab0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2aac0 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70   = pCur->ix;.  p
2aad0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2aae0 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d  ->iPage] = pCur-
2aaf0 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  >pPage;.  pCur->
2ab00 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ix = 0;.  pCur->
2ab10 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72  iPage++;.  retur
2ab20 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
2ab30 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
2ab40 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
2ab50 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  r, pCur->curPage
2ab60 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64  rFlags);.}..#ifd
2ab70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2ab80 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65  /*.** Page pPare
2ab90 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  nt is an interna
2aba0 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65  l (non-leaf) tre
2abb0 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
2abc0 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74  ction .** assert
2abd0 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62  s that page numb
2abe0 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65  er iChild is the
2abf0 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74   left-child if t
2ac00 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65  he iIdx'th.** ce
2ac10 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65  ll in page pPare
2ac20 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20  nt. Or, if iIdx 
2ac30 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  is equal to the 
2ac40 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a  total number of.
2ac50 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  ** cells in pPar
2ac60 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e  ent, that page n
2ac70 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
2ac80 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2ac90 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a  of.** the page..
2aca0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
2acb0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2acc0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e  (MemPage *pParen
2acd0 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e  t, int iIdx, Pgn
2ace0 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28  o iChild){.  if(
2acf0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65   CORRUPT_DB ) re
2ad00 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
2ad10 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20  nditions tested 
2ad20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20  below might not 
2ad30 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20  be true.        
2ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad50 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72      ** in a corr
2ad60 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  upt database */.
2ad70 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d    assert( iIdx<=
2ad80 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
2ad90 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50  ;.  if( iIdx==pP
2ada0 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  arent->nCell ){.
2adb0 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2adc0 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61  byte(&pParent->a
2add0 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64  Data[pParent->hd
2ade0 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68  rOffset+8])==iCh
2adf0 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ild );.  }else{.
2ae00 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
2ae10 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2ae20 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69  arent, iIdx))==i
2ae30 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23  Child );.  }.}.#
2ae40 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61  else.#  define a
2ae50 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
2ae60 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a  (x,y,z) .#endif.
2ae70 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2ae80 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65  cursor up to the
2ae90 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a   parent page..**
2aea0 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73  .** pCur->idx is
2aeb0 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c   set to the cell
2aec0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74   index that cont
2aed0 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72  ains the pointer
2aee0 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20  .** to the page 
2aef0 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72  we are coming fr
2af00 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63  om.  If we are c
2af10 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a  oming from the.*
2af20 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  * right-most chi
2af30 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75  ld page then pCu
2af40 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2af50 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a   one more than.*
2af60 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65  * the largest ce
2af70 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ll index..*/.sta
2af80 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50  tic void moveToP
2af90 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  arent(BtCursor *
2afa0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2afb0 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72   *pLeaf;.  asser
2afc0 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2afd0 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2afe0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2aff0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2b000 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2b010 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
2b020 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2b030 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ->pPage );.  ass
2b040 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
2b050 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
2b060 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2b070 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
2b080 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
2b090 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61  , .    pCur->pPa
2b0a0 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  ge->pgno.  );.  
2b0b0 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
2b0c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2b0d0 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
2b0e0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
2b0f0 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
2b100 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2b110 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2b120 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2b130 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2b140 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
2b150 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69  r->ix = pCur->ai
2b160 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
2b170 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43  1];.  pLeaf = pC
2b180 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75  ur->pPage;.  pCu
2b190 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d  r->pPage = pCur-
2b1a0 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e  >apPage[--pCur->
2b1b0 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73  iPage];.  releas
2b1c0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65  ePageNotNull(pLe
2b1d0 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  af);.}../*.** Mo
2b1e0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2b1f0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f   point to the ro
2b200 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62  ot page of its b
2b210 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2b220 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61  .**.** If the ta
2b230 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61  ble has a virtua
2b240 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65  l root page, the
2b250 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2b260 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a  moved to point.*
2b270 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c  * to the virtual
2b280 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65   root page inste
2b290 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c  ad of the actual
2b2a0 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61   root page. A ta
2b2b0 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72  ble has a.** vir
2b2c0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77  tual root page w
2b2d0 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72  hen the actual r
2b2e0 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  oot page contain
2b2f0 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61  s no cells and a
2b300 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c   .** single chil
2b310 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e  d page. This can
2b320 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74   only happen wit
2b330 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  h the table root
2b340 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a  ed at page 1..**
2b350 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65  .** If the b-tre
2b360 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65  e structure is e
2b370 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72  mpty, the cursor
2b380 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f   state is set to
2b390 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41   .** CURSOR_INVA
2b3a0 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75  LID and this rou
2b3b0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
2b3c0 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72  ITE_EMPTY. Other
2b3d0 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72  wise,.** the cur
2b3e0 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
2b3f0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
2b400 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e   cell located on
2b410 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72   the root.** (or
2b420 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
2b430 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
2b440 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20  or state is set 
2b450 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e  to CURSOR_VALID.
2b460 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
2b470 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
2b480 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74  successfully, it
2b490 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20   may be assumed 
2b4a0 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65  that the.** page
2b4b0 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e  -header flags in
2b4c0 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20  dicate that the 
2b4d0 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70  [virtual] root-p
2b4e0 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63  age is the expec
2b4f0 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20  ted .** kind of 
2b500 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65  b-tree page (i.e
2b510 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e  . if when openin
2b520 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65  g the cursor the
2b530 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a   caller did not.
2b540 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79  ** specify a Key
2b550 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
2b560 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73  he flags byte is
2b570 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20   set to 0x05 or 
2b580 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74  0x0D,.** indicat
2b590 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72  ing a table b-tr
2b5a0 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61  ee, or if the ca
2b5b0 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79  ller did specify
2b5c0 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73   a KeyInfo .** s
2b5d0 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61  tructure the fla
2b5e0 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74  gs byte is set t
2b5f0 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20  o 0x02 or 0x0A, 
2b600 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e  indicating an in
2b610 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a  dex.** b-tree)..
2b620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
2b630 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
2b640 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
2b650 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
2b660 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2b670 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2b680 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2b690 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2b6a0 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
2b6b0 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
2b6c0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2b6d0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2b6e0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
2b6f0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2b700 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
2b710 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
2b720 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2b730 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b740 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  te < CURSOR_REQU
2b750 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d  IRESEEK || pCur-
2b760 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73  >iPage<0 );.  as
2b770 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2b780 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e  Root>0 || pCur->
2b790 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66  iPage<0 );..  if
2b7a0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
2b7b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2b7c0 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20  ->iPage ){.     
2b7d0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2b7e0 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29  ull(pCur->pPage)
2b7f0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d  ;.      while( -
2b800 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a  -pCur->iPage ){.
2b810 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2b820 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
2b830 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b840 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  age]);.      }. 
2b850 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65       pCur->pPage
2b860 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2b870 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  0];.      goto s
2b880 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a  kip_init;.    }.
2b890 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
2b8a0 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
2b8b0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2b8c0 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2b8d0 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
2b8e0 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d  QLITE_EMPTY;.  }
2b8f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2b900 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28  ( pCur->iPage==(
2b910 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
2b920 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
2b930 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2b940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  ){.      if( pCu
2b950 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b960 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
2b970 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b980 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
2b990 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20  E_OK );.        
2b9a0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2b9b0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2b9c0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2b9d0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
2b9e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  r);.    }.    rc
2b9f0 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
2ba00 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  e(pCur->pBtree->
2ba10 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2ba20 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67  oot, &pCur->pPag
2ba30 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2ba40 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
2ba50 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
2ba60 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
2ba70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ba80 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2ba90 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2baa0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
2bab0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
2bac0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
2bad0 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
2bae0 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  y = pCur->pPage-
2baf0 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
2bb00 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61  Root = pCur->pPa
2bb10 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52  ge;.  assert( pR
2bb20 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
2bb30 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20  >pgnoRoot );..  
2bb40 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79  /* If pCur->pKey
2bb50 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Info is not NULL
2bb60 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
2bb70 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68  r that opened th
2bb80 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65  is cursor.  ** e
2bb90 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20  xpected to open 
2bba0 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62  it on an index b
2bbb0 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65  -tree. Otherwise
2bbc0 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73  , if pKeyInfo is
2bbd0 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20  .  ** NULL, the 
2bbe0 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61  caller expects a
2bbf0 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49   table b-tree. I
2bc00 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2bc10 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74  e case,.  ** ret
2bc20 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f  urn an SQLITE_CO
2bc30 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20  RRUPT error. .  
2bc40 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20  **.  ** Earlier 
2bc50 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
2bc60 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  te assumed that 
2bc70 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20  this test could 
2bc80 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66  not fail.  ** if
2bc90 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77   the root page w
2bca0 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65  as already loade
2bcb0 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
2bcc0 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
2bcd0 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43  (i.e..  ** if pC
2bce0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42  ur->iPage>=0). B
2bcf0 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73  ut this is not s
2bd00 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  o if the databas
2bd10 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a  e is corrupted .
2bd20 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77    ** in such a w
2bd30 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f  ay that page pRo
2bd40 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74  ot is linked int
2bd50 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65  o a second b-tre
2bd60 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f  e table .  ** (o
2bd70 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e  r the freelist).
2bd80 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
2bd90 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20  Root->intKey==1 
2bda0 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  || pRoot->intKey
2bdb0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f  ==0 );.  if( pRo
2bdc0 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c  ot->isInit==0 ||
2bdd0 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f   (pCur->pKeyInfo
2bde0 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74  ==0)!=pRoot->int
2bdf0 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
2be00 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
2be10 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67  _PAGE(pCur->pPag
2be20 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e  e);.  }..skip_in
2be30 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78  it:  .  pCur->ix
2be40 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
2be50 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2be60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2be70 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2be80 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
2be90 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
2bea0 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
2beb0 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52  >pPage;.  if( pR
2bec0 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a  oot->nCell>0 ){.
2bed0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2bee0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2bef0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52  .  }else if( !pR
2bf00 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  oot->leaf ){.   
2bf10 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20   Pgno subpage;. 
2bf20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67     if( pRoot->pg
2bf30 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  no!=1 ) return S
2bf40 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2bf50 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20  PT;.    subpage 
2bf60 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f  = get4byte(&pRoo
2bf70 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e  t->aData[pRoot->
2bf80 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2bf90 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2bfa0 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2bfb0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
2bfc0 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61  hild(pCur, subpa
2bfd0 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ge);.  }else{.  
2bfe0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2bff0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2c000 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c010 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65  _EMPTY;.  }.  re
2c020 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2c030 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2c040 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65  r down to the le
2c050 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74  ft-most leaf ent
2c060 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a  ry beneath the.*
2c070 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  * entry to which
2c080 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2c090 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a   pointing..**.**
2c0a0 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   The left-most l
2c0b0 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77  eaf is the one w
2c0c0 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74  ith the smallest
2c0d0 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74   key - the first
2c0e0 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
2c0f0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2c100 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74  c int moveToLeft
2c110 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2c120 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2c130 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2c140 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2c150 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2c160 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2c170 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2c180 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2c190 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c1a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
2c1b0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
2c1c0 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
2c1d0 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
2c1e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c1f0 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e  pCur->ix<pPage->
2c200 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
2c210 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
2c220 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
2c230 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20  r->ix));.    rc 
2c240 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2c250 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
2c260 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2c270 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
2c280 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
2c290 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
2c2a0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2c2b0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
2c2c0 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
2c2d0 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
2c2e0 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
2c2f0 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
2c300 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
2c310 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
2c320 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
2c330 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
2c340 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
2c350 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
2c360 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
2c370 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
2c380 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
2c390 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2c3a0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
2c3b0 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
2c3c0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2c3d0 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
2c3e0 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
2c3f0 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
2c400 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
2c410 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
2c420 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
2c430 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2c440 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2c450 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2c460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2c470 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2c480 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2c490 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2c4a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2c4b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2c4c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2c4d0 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
2c4e0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e  = pCur->pPage)->
2c4f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2c500 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2c510 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2c520 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2c530 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70      pCur->ix = p
2c540 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
2c550 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2c560 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
2c570 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2c580 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
2c590 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2c5a0 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
2c5b0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
2c5c0 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
2c5d0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2c5e0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
2c5f0 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
2c600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c610 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2c620 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
2c630 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2c640 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2c650 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2c660 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2c670 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2c680 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2c690 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2c6a0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2c6b0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2c6c0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2c6d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c6e0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
2c6f0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2c700 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
2c710 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2c720 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2c730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2c740 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2c750 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2c760 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
2c770 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2c780 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2c790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c7a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2c7b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
2c7c0 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
2c7d0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2c7e0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2c7f0 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53   }else if( rc==S
2c800 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20  QLITE_EMPTY ){. 
2c810 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c820 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2c830 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2c840 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52  ll==0 );.    *pR
2c850 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  es = 1;.    rc =
2c860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2c870 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2c880 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2c890 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  ion is a no-op i
2c8a0 66 20 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f  f cursor pCur do
2c8b0 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20  es not point to 
2c8c0 61 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20  a valid row..** 
2c8d0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
2c8e0 75 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e  ur is valid, con
2c8f0 66 69 67 75 72 65 20 69 74 20 73 6f 20 74 68 61  figure it so tha
2c900 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20  t the next call 
2c910 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
2c920 65 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f  eeNext() is a no
2c930 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  -op..*/.#ifndef 
2c940 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
2c950 4f 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69  OWFUNC.void sqli
2c960 74 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74  te3BtreeSkipNext
2c970 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2c980 7b 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76  {.  /* We believ
2c990 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
2c9a0 72 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65  r must always be
2c9b0 20 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74   in the valid st
2c9c0 61 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68  ate when.  ** th
2c9d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2c9e0 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70 72  lled, but the pr
2c9f0 6f 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c 74  oof is difficult
2ca00 2c 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20  , so we add an. 
2ca10 20 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73   ** ALWaYS() tes
2ca20 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77  t just in case w
2ca30 65 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a  e are wrong. */.
2ca40 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75    if( ALWAYS(pCu
2ca50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2ca60 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20  R_VALID) ){.    
2ca70 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2ca80 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a  URSOR_SKIPNEXT;.
2ca90 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2caa0 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65  xt = 1;.  }.}.#e
2cab0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2cac0 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a  MIT_WINDOWFUNC *
2cad0 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  /../* Move the c
2cae0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
2caf0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2cb00 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
2cb10 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
2cb20 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
2cb30 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
2cb40 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
2cb50 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
2cb60 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
2cb70 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
2cb80 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2cb90 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2cba0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
2cbb0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2cbc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
2cbd0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2cbe0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2cbf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
2cc00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2cc10 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
2cc20 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
2cc30 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
2cc40 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
2cc50 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2cc60 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
2cc70 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
2cc80 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
2cc90 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
2cca0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2ccb0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
2ccc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
2ccd0 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
2cce0 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
2ccf0 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
2cd00 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
2cd10 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
2cd20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
2cd30 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
2cd40 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
2cd50 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
2cd60 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
2cd70 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
2cd80 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2cd90 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
2cda0 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
2cdb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2cdc0 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43  rt( pCur->ix==pC
2cdd0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2cde0 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -1 );.    assert
2cdf0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  ( pCur->pPage->l
2ce00 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  eaf );.#endif.  
2ce10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ce20 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OK;.  }..  rc = 
2ce30 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29  moveToRoot(pCur)
2ce40 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ce50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
2ce60 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ce70 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2ce80 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30  );.    *pRes = 0
2ce90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2cea0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
2ceb0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2cec0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ced0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2cee0 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  |= BTCF_AtLast;.
2cef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cf00 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2cf10 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2cf20 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
2cf30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2cf40 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72  PTY ){.    asser
2cf50 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2cf60 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2cf70 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2cf80 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
2cf90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2cfa0 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OK;.  }.  return
2cfb0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20   rc;.}../* Move 
2cfc0 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68  the cursor so th
2cfd0 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
2cfe0 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68  an entry near th
2cff0 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66  e key .** specif
2d000 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f  ied by pIdxKey o
2d010 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75  r intKey.   Retu
2d020 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64  rn a success cod
2d030 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54  e..**.** For INT
2d040 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20  KEY tables, the 
2d050 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72  intKey parameter
2d060 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b   is used.  pIdxK
2d070 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e  ey .** must be N
2d080 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20  ULL.  For index 
2d090 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20  tables, pIdxKey 
2d0a0 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b  is used and intK
2d0b0 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ey.** is ignored
2d0c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78  ..**.** If an ex
2d0d0 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74  act match is not
2d0e0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
2d0f0 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79   cursor is alway
2d100 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69  s.** left pointi
2d110 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67  ng at a leaf pag
2d120 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f  e which would ho
2d130 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20  ld the entry if 
2d140 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  it.** were prese
2d150 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  nt.  The cursor 
2d160 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2d170 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d  n entry that com
2d180 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20  es.** before or 
2d190 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a  after the key..*
2d1a0 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20  *.** An integer 
2d1b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
2d1c0 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74  *pRes which is t
2d1d0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
2d1e0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65  comparing the ke
2d1f0 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79  y with the entry
2d200 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75   to which the cu
2d210 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e  rsor is .** poin
2d220 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69  ting.  The meani
2d230 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ng of the intege
2d240 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a  r written into.*
2d250 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f  * *pRes is as fo
2d260 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
2d270 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68   *pRes<0      Th
2d280 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2d290 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2d2a0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2d2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2d2c0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69  s smaller than i
2d2d0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72  ntKey/pIdxKey or
2d2e0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2d2f0 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20   empty.**       
2d300 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74             and t
2d310 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65  he cursor is the
2d320 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e  refore left poin
2d330 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a  t to nothing..**
2d340 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30  .**     *pRes==0
2d350 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2d360 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2d370 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2d380 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2d390 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61        exactly ma
2d3a0 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64  tches intKey/pId
2d3b0 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  xKey..**.**     
2d3c0 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65  *pRes>0      The
2d3d0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2d3e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2d3f0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2d410 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74   larger than int
2d420 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2d430 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  ** For index tab
2d440 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79  les, the pIdxKey
2d450 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69  ->eqSeen field i
2d460 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68  s set to 1 if th
2d470 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e  ere.** exists an
2d480 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2d490 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79  ble that exactly
2d4a0 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79   matches pIdxKey
2d4b0 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  .  .*/.int sqlit
2d4c0 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  e3BtreeMovetoUnp
2d4d0 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  acked(.  BtCurso
2d4e0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2d4f0 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
2d500 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20  to be moved */. 
2d510 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
2d520 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70  *pIdxKey, /* Unp
2d530 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20  acked index key 
2d540 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c  */.  i64 intKey,
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d560 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a   The table key *
2d570 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68  /.  int biasRigh
2d580 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
2d590 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
2d5a0 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
2d5b0 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
2d5c0 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
2d5d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
2d5e0 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68  search results h
2d5f0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
2d600 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70  rc;.  RecordComp
2d610 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  are xRecordCompa
2d620 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  re;..  assert( c
2d630 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2d640 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2d650 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2d660 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2d670 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2d680 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2d690 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2d6a0 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2d6b0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2d6c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d6d0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2d6e0 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49  SOR_VALID || (pI
2d6f0 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2d700 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20  ->curIntKey!=0) 
2d710 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2d720 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2d730 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
2d740 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
2d750 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
2d760 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
2d770 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
2d780 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
2d790 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65   */.  if( pIdxKe
2d7a0 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d  y==0.   && pCur-
2d7b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2d7c0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2d7d0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2d7e0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2d7f0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2d800 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2d810 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
2d820 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
2d830 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d840 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
2d850 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
2d860 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  Key ){.      if(
2d870 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2d880 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2d890 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2d8a0 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Res = -1;.      
2d8b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d8c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
2d8d0 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75    /* If the requ
2d8e0 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65  ested key is one
2d8f0 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70   more than the p
2d900 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65  revious key, the
2d910 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74  n.      ** try t
2d920 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e  o get there usin
2d930 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  g sqlite3BtreeNe
2d940 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e  xt() rather than
2d950 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a   a full.      **
2d960 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20   binary search. 
2d970 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69   This is an opti
2d980 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20  mization only.  
2d990 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77  The correct answ
2d9a0 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  er.      ** is s
2d9b0 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69  till obtained wi
2d9c0 74 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c  thout this case,
2d9d0 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d   only a little m
2d9e0 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20  ore slowely */. 
2d9f0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2da00 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b  nfo.nKey+1==intK
2da10 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  ey ){.        *p
2da20 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2da30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2da40 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2da50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
2da60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2da70 20 20 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49          getCellI
2da80 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
2da90 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
2daa0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
2dab0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2dac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dad0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2dae0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2daf0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
2db00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2db10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2db20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2db30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2db40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2db50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
2db60 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2db70 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2db80 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2db90 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2dba0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2dbb0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2dbc0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2dbd0 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2dbe0 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2dbf0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2dc00 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2dc10 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2dc20 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2dc30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2dc40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2dc50 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2dc60 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2dc70 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2dc80 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2dc90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
2dca0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50 54   rc==SQLITE_EMPT
2dcb0 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  Y ){.      asser
2dcc0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2dcd0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50  t==0 || pCur->pP
2dce0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
2dcf0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 2d  .      *pRes = -
2dd00 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2dd10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2dd20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2dd30 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2dd40 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
2dd50 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
2dd60 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2dd70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2dd80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2dd90 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2dda0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2ddb0 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73 73 65  ll > 0 );.  asse
2ddc0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
2ddd0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2dde0 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d 70  ge[0]->intKey==p
2ddf0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29  Cur->curIntKey )
2de00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2de10 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 70  ->curIntKey || p
2de20 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72 28  IdxKey );.  for(
2de30 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
2de40 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a 20  , upr, idx, c;. 
2de50 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
2de60 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
2de70 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
2de80 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2deb0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2dec0 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
2ded0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
2dee0 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
2def0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
2df00 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2df10 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2df20 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
2df30 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
2df40 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
2df50 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
2df60 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
2df70 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2df80 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
2df90 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
2dfa0 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
2dfb0 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
2dfc0 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
2dfd0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
2dfe0 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
2dff0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
2e000 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
2e010 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
2e020 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
2e030 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
2e040 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
2e050 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
2e060 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
2e070 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
2e080 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
2e090 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2e0a0 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
2e0b0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2e0c0 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
2e0d0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
2e0e0 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
2e0f0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
2e100 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
2e110 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
2e120 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
2e130 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
2e140 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
2e150 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
2e160 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2e170 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2e180 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
2e190 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
2e1a0 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
2e1b0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
2e1c0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2e1d0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2e1e0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2e1f0 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
2e200 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2e210 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2e220 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
2e230 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
2e240 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2e250 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
2e260 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  aEnd ){.        
2e270 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e280 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2e290 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2e2a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e2b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2e2c0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70       getVarint(p
2e2d0 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65  Cell, (u64*)&nCe
2e2e0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2e2f0 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
2e300 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
2e310 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
2e320 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2e330 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62  upr ){ c = -1; b
2e340 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20  reak; }.        
2e350 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b  }else if( nCellK
2e360 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey>intKey ){.   
2e370 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
2e380 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  -1;.          if
2e390 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2e3a0 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   +1; break; }.  
2e3b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e3c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2e3d0 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
2e3e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  );.          pCu
2e3f0 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2e400 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2e410 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2e420 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
2e430 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
2e440 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
2e450 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
2e460 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e470 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2e480 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
2e490 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20 20  alidNKey;.      
2e4a0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2e4b0 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
2e4c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  ;.            pC
2e4d0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2e4e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2e4f0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2e500 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e510 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2e520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2e530 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2e540 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20  wr+upr>=0 );.   
2e550 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b       idx = (lwr+
2e560 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78  upr)>>1;  /* idx
2e570 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20   = (lwr+upr)/2; 
2e580 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
2e590 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
2e5a0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ;;){.        int
2e5b0 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65   nCell;  /* Size
2e5c0 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20 63 65   of the pCell ce
2e5d0 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ll in bytes */. 
2e5e0 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2e5f0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2e600 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20 20 20  Page, idx);..   
2e610 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69       /* The maxi
2e620 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20 70 61  mum supported pa
2e630 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35 33 36  ge-size is 65536
2e640 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d 65 61   bytes. This mea
2e650 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
2e660 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** the maximum n
2e670 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 20  umber of record 
2e680 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f 6e 20  bytes stored on 
2e690 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65 65 0a  an index B-Tree.
2e6a0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2e6b0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 36 33  is less than 163
2e6c0 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d 61 79  84 bytes and may
2e6d0 20 62 65 20 73 74 6f 72 65 64 20 61 73 20 61 20   be stored as a 
2e6e0 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20 20 2a  2-byte.        *
2e6f0 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 69  * varint. This i
2e700 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
2e710 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f  ed to attempt to
2e720 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67 20 0a   avoid parsing .
2e730 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65          ** the e
2e740 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20 63 68  ntire cell by ch
2e750 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65 20 63  ecking for the c
2e760 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 72  ases where the r
2e770 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20 20 20  ecord is .      
2e780 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e 74 69    ** stored enti
2e790 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68 65 20  rely within the 
2e7a0 62 2d 74 72 65 65 20 70 61 67 65 20 62 79 20 69  b-tree page by i
2e7b0 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20 66 69  nspecting the fi
2e7c0 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  rst .        ** 
2e7d0 32 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 63  2 bytes of the c
2e7e0 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ell..        */.
2e7f0 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20          nCell = 
2e800 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20 20 20  pCell[0];.      
2e810 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70 50 61    if( nCell<=pPa
2e820 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
2e830 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oad ){.         
2e840 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
2e850 72 75 6e 73 20 69 66 20 74 68 65 20 72 65 63 6f  runs if the reco
2e860 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  rd-size field of
2e870 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61 0a 20   the cell is a. 
2e880 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69 6e 67           ** sing
2e890 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74 20 61  le byte varint a
2e8a0 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20 66 69  nd the record fi
2e8b0 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74  ts entirely on t
2e8c0 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20 20 20  he main.        
2e8d0 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65    ** b-tree page
2e8e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2e8f0 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2e900 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e  nCell+1==pPage->
2e910 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2e920 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2e930 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2e940 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 31 5d  (void*)&pCell[1]
2e950 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2e960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
2e970 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38 30 29  pCell[1] & 0x80)
2e980 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
2e990 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c 6c 26  nCell = ((nCell&
2e9a0 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43 65 6c  0x7f)<<7) + pCel
2e9b0 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e 6d 61  l[1])<=pPage->ma
2e9c0 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20 20 29  xLocal.        )
2e9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2e9e0 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66  he record-size f
2e9f0 69 65 6c 64 20 69 73 20 61 20 32 20 62 79 74 65  ield is a 2 byte
2ea00 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68 65 20   varint and the 
2ea10 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20 20 20  record .        
2ea20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69 72 65    ** fits entire
2ea30 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 62  ly on the main b
2ea40 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f 0a  -tree page.  */.
2ea50 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2ea60 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b  se( pCell+nCell+
2ea70 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 45  2==pPage->aDataE
2ea80 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nd );.          
2ea90 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61  c = xRecordCompa
2eaa0 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64 2a  re(nCell, (void*
2eab0 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49 64 78  )&pCell[2], pIdx
2eac0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
2ead0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2eae0 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66 6c 6f  * The record flo
2eaf0 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f 6e 65  ws over onto one
2eb00 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f   or more overflo
2eb10 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20 20 20  w pages. In.    
2eb20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61        ** this ca
2eb30 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63 65 6c  se the whole cel
2eb40 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 61  l needs to be pa
2eb50 72 73 65 64 2c 20 61 20 62 75 66 66 65 72 20 61  rsed, a buffer a
2eb60 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 20  llocated.       
2eb70 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65 73 73     ** and access
2eb80 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64 20 74  Payload() used t
2eb90 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 20 72  o retrieve the r
2eba0 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 0a 20  ecord into the. 
2ebb0 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75 66 66           ** buff
2ebc0 65 72 20 62 65 66 6f 72 65 20 56 64 62 65 52 65  er before VdbeRe
2ebd0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63 61  cordCompare() ca
2ebe0 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a 20 20  n be called. .  
2ebf0 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2ec00 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72       ** If the r
2ec10 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
2ec20 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43 6f 6d  , the xRecordCom
2ec30 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d 61 79  pare routine may
2ec40 20 72 65 61 64 0a 20 20 20 20 20 20 20 20 20 20   read.          
2ec50 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76 61 72  ** up to two var
2ec60 69 6e 74 73 20 70 61 73 74 20 74 68 65 20 65 6e  ints past the en
2ec70 64 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 2e  d of the buffer.
2ec80 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a 20 20   An extra 18 .  
2ec90 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73          ** bytes
2eca0 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20 61   of padding is a
2ecb0 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68 65 20  llocated at the 
2ecc0 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2ecd0 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  r in.          *
2ece0 2a 20 63 61 73 65 20 74 68 69 73 20 68 61 70 70  * case this happ
2ecf0 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ens.  */.       
2ed00 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65     void *pCellKe
2ed10 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38 20  y;.          u8 
2ed20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42 6f 64  * const pCellBod
2ed30 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50 61 67  y = pCell - pPag
2ed40 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
2ed50 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
2ed60 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
2ed70 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c 20 26  ge, pCellBody, &
2ed80 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20  pCur->info);.   
2ed90 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d 20 28         nCell = (
2eda0 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  int)pCur->info.n
2edb0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 74  Key;.          t
2edc0 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3c 30  estcase( nCell<0
2edd0 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66   );   /* True if
2ede0 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32 5e 33   key size is 2^3
2edf0 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20 20 20  2 or more */.   
2ee00 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
2ee10 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a   nCell==0 );  /*
2ee20 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a   Invalid key siz
2ee30 65 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78  e:  0x80 0x80 0x
2ee40 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  00 */.          
2ee50 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d  testcase( nCell=
2ee60 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69  =1 );  /* Invali
2ee70 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30 78 38  d key size:  0x8
2ee80 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f 0a 20  0 0x80 0x01 */. 
2ee90 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2eea0 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b 20 20  e( nCell==2 );  
2eeb0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67 61 6c  /* Minimum legal
2eec0 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a 65 20   index key size 
2eed0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
2eee0 20 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43 65 6c   nCell<2 || nCel
2eef0 6c 2f 70 43 75 72 2d 3e 70 42 74 2d 3e 75 73 61  l/pCur->pBt->usa
2ef00 62 6c 65 53 69 7a 65 3e 70 43 75 72 2d 3e 70 42  bleSize>pCur->pB
2ef10 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  t->nPage ){.    
2ef20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2ef30 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
2ef40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2ef50 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2ef60 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
2ef70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
2ef80 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
2ef90 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31  3Malloc( nCell+1
2efa0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  8 );.          i
2efb0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
2efc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2efd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2efe0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2eff0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2f000 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2f010 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2f020 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b  ->ix = (u16)idx;
2f030 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f040 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2f050 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2f060 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2f070 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20 20 20  ellKey, 0);.    
2f080 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46        pCur->curF
2f090 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
2f0a0 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 20  lidOvfl;.       
2f0b0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2f0c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f0d0 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b  _free(pCellKey);
2f0e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2f0f0 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2f100 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2f110 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f         c = xReco
2f120 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2f130 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2f140 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2f150 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2f160 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2f170 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f180 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2f190 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2f1a0 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2f1b0 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2f1c0 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2f1d0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2f1e0 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2f1f0 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2f200 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2f210 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2f220 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2f230 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2f240 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2f250 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2f260 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2f270 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f280 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2f290 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2f2a0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2f2b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f2c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2f2d0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2f2e0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2f2f0 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2f300 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2f310 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f320 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2f330 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2f340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2f350 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2f360 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2f370 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2f380 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2f390 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2f3a0 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2f3b0 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2f3c0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f3d0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2f3e0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2f3f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2f400 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f410 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2f420 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2f430 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2f440 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2f450 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2f460 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
2f470 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2f480 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
2f490 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f4a0 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
2f4b0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2f4c0 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
2f4d0 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
2f4e0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
2f4f0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
2f500 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
2f510 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2f520 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2f530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f540 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2f550 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2f560 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
2f570 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2f580 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
2f590 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2f5a0 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
2f5b0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2f5c0 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
2f5d0 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
2f5e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
2f5f0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2f600 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2f610 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2f620 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2f630 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2f640 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2f650 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2f660 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2f670 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2f680 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2f690 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2f6a0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2f6b0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2f6c0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2f6d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2f6e0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2f6f0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2f700 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2f710 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2f720 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2f730 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2f740 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2f750 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2f760 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2f770 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2f780 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2f790 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2f7a0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2f7b0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2f7c0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2f7d0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2f7e0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2f7f0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2f800 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2f810 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2f820 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2f830 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2f840 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2f850 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2f860 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
2f870 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68   estimate for th
2f880 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2f890 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2f8a0 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f  at pCur is.** po
2f8b0 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75  inting to.  Retu
2f8c0 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
2f8d0 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d  mber if no estim
2f8e0 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ate is currently
2f8f0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a   .** available..
2f900 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
2f910 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42  reeRowCountEst(B
2f920 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2f930 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b    i64 n;.  u8 i;
2f940 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2f950 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2f960 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2f970 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f980 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2f990 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2f9a0 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79  ..  /* Currently
2f9b0 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   this interface 
2f9c0 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
2f9d0 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c  y the OP_IfSmall
2f9e0 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20  er.  ** opcode, 
2f9f0 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73 65  and it that case
2fa00 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
2fa10 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64   always be valid
2fa20 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61   and.  ** will a
2fa30 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61  lways point to a
2fa40 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
2fa50 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2fa60 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2fa70 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20  VALID) ) return 
2fa80 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  -1;.  if( NEVER(
2fa90 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
2faa0 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d  f==0) ) return -
2fab0 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e  1;..  n = pCur->
2fac0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2fad0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d  for(i=0; i<pCur-
2fae0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
2faf0 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50    n *= pCur->apP
2fb00 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20  age[i]->nCell;. 
2fb10 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
2fb20 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2fb30 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2fb40 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2fb50 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
2fb60 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a  * Return value:.
2fb70 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
2fb80 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65 73  OK        succes
2fb90 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  s.**    SQLITE_D
2fba0 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72 20  ONE      cursor 
2fbb0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
2fbc0 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20  ing at the last 
2fbd0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74  element.**    ot
2fbe0 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20 73  herwise        s
2fbf0 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
2fc00 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
2fc10 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2fc20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2fc30 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2fc40 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2fc50 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2fc60 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2fc70 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2fc80 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2fc90 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2fca0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2fcb0 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2fcc0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2fcd0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2fce0 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2fcf0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2fd00 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2fd10 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2fd20 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2fd30 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2fd40 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2fd50 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  r..**.** If bit 
2fd60 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72  0x01 of the F ar
2fd70 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  gument in sqlite
2fd80 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20  3BtreeNext(C,F) 
2fd90 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a  is 1, then the.*
2fda0 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  * cursor corresp
2fdb0 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2fdc0 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2fdd0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2fde0 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64   been.** skipped
2fdf0 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65   if the SQL inde
2fe00 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  x had been a uni
2fe10 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2fe20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  F argument.** is
2fe30 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
2fe40 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74  mplement.  SQLit
2fe50 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2fe60 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  tation does not 
2fe70 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74  use.** this hint
2fe80 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2fe90 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2fea0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2feb0 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2fec0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2fed0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2fee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2fef0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2ff00 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2ff10 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
2ff20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ff30 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2ff40 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2ff50 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ff60 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2ff70 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
2ff80 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2ff90 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2ffa0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ffb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2ffc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ffd0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2ffe0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2fff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
30000 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
30010 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
30020 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
30030 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 70  PNEXT ){.      p
30040 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
30050 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
30060 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
30070 4e 65 78 74 3e 30 20 29 20 72 65 74 75 72 6e 20  Next>0 ) return 
30080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
30090 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
300a0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
300b0 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b  dx = ++pCur->ix;
300c0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
300d0 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  sInit ){.    /* 
300e0 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77  The only known w
300f0 61 79 20 66 6f 72 20 74 68 69 73 20 74 6f 20 68  ay for this to h
30100 61 70 70 65 6e 20 69 73 20 66 6f 72 20 74 68 65  appen is for the
30110 72 65 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a  re to be a.    *
30120 2a 20 72 65 63 75 72 73 69 76 65 20 53 51 4c 20  * recursive SQL 
30130 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f  function that do
30140 65 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72  es a DELETE oper
30150 61 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66  ation as part of
30160 20 61 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54   a.    ** SELECT
30170 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 63   which deletes c
30180 6f 6e 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20  ontent out from 
30190 75 6e 64 65 72 20 61 6e 20 61 63 74 69 76 65 20  under an active 
301a0 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  cursor.    ** in
301b0 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
301c0 61 73 65 20 66 69 6c 65 20 77 68 65 72 65 20 74  ase file where t
301d0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 44  he table being D
301e0 45 4c 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20  ELETE-ed from.  
301f0 20 20 2a 2a 20 68 61 73 20 70 61 67 65 73 20 69    ** has pages i
30200 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68  n common with th
30210 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75  e table being qu
30220 65 72 69 65 64 2e 20 20 53 65 65 20 54 48 33 0a  eried.  See TH3.
30230 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f      ** module co
30240 76 31 2f 62 74 72 65 65 37 38 2e 74 65 73 74 20  v1/btree78.test 
30250 74 65 73 74 63 61 73 65 20 32 32 30 20 28 32 30  testcase 220 (20
30260 31 38 2d 30 36 2d 30 38 29 20 66 6f 72 20 61 6e  18-06-08) for an
30270 0a 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e  .    ** example.
30280 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
30290 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
302a0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
302b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
302c0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
302d0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
302e0 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
302f0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
30300 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
30310 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
30320 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
30330 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
30340 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
30350 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
30360 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
30370 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
30380 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
30390 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
303a0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
303b0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
303c0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
303d0 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
303e0 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
303f0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
30400 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
30410 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
30420 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
30430 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
30440 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
30450 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
30460 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
30470 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
30480 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
30490 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
304a0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
304b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
304c0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
304d0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
304e0 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
304f0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
30500 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
30510 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
30520 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
30530 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30540 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
30550 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
30560 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
30570 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
30580 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
30590 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67  ( pCur->ix>=pPag
305a0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
305b0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
305c0 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
305d0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
305e0 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  xt(pCur, 0);.   
305f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
30600 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
30620 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
30630 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30640 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
30650 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
30660 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
30670 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33   }.}.int sqlite3
30680 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
30690 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c  or *pCur, int fl
306a0 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ags){.  MemPage 
306b0 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44  *pPage;.  UNUSED
306c0 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
306d0 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
306e0 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
306f0 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
30700 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30710 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
30720 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
30730 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
30740 67 73 3d 3d 31 20 29 3b 0a 20 20 70 43 75 72 2d  gs==1 );.  pCur-
30750 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
30760 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
30770 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
30780 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
30790 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
307a0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
307b0 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
307c0 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
307d0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
307e0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28  ->pPage;.  if( (
307f0 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61  ++pCur->ix)>=pPa
30800 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
30810 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
30820 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
30830 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69  t(pCur);.  }.  i
30840 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
30850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
30870 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
30880 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
30890 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
308a0 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
308b0 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
308c0 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
308d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
308e0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  ..** Return valu
308f0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  es:.**.**     SQ
30900 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63  LITE_OK     succ
30910 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ess.**     SQLIT
30920 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72  E_DONE   the cur
30930 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
30940 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  n the first elem
30950 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
30960 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73  .**     otherwis
30970 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20  e     some kind 
30980 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  of error occurre
30990 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  d.**.** The main
309a0 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
309b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
309c0 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
309d0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
309e0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
309f0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
30a00 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
30a10 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
30a20 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
30a30 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
30a40 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
30a50 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
30a60 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
30a70 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
30a80 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
30a90 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
30aa0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
30ab0 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
30ac0 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
30ad0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
30ae0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
30af0 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
30b00 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
30b10 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
30b20 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65  s(C,F) is 1, the
30b30 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  n.** the cursor 
30b40 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
30b50 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
30b60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
30b70 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ld have been.** 
30b80 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53  skipped if the S
30b90 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
30ba0 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  n a unique index
30bb0 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e  .  The F argumen
30bc0 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74  t is a.** hint t
30bd0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e  o the implement.
30be0 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c    The native SQL
30bf0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
30c00 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
30c10 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69  t.** use this hi
30c20 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
30c30 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
30c40 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
30c50 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
30c60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
30c70 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
30c80 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
30c90 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30ca0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30cb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
30cc0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30cd0 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
30ce0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
30cf0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
30d00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
30d10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
30d20 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
30d30 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30d40 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
30d50 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
30d60 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
30d70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30d80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
30d90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
30da0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
30db0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
30dc0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ate ){.      ret
30dd0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
30de0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
30df0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d  URSOR_SKIPNEXT==
30e00 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
30e10 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
30e20 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
30e30 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
30e40 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 20  r->skipNext<0 ) 
30e50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30e60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
30e70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
30e80 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
30e90 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
30ea0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30eb0 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
30ec0 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20   = pCur->ix;.   
30ed0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
30ee0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
30ef0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
30f00 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
30f10 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30f20 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
30f30 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
30f40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
30f50 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30  ile( pCur->ix==0
30f60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
30f70 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
30f80 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
30f90 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
30fa0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
30fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
30fc0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
30fd0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
30fe0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ur);.    }.    a
30ff0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
31000 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
31010 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
31020 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
31030 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
31040 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69   );..    pCur->i
31050 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  x--;.    pPage =
31060 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
31070 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
31080 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
31090 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
310a0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
310b0 65 76 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b  evious(pCur, 0);
310c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
310d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
310e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
310f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
31100 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
31110 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
31120 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ur, int flags){.
31130 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
31140 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
31150 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
31160 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
31170 73 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  s==1 );.  UNUSED
31180 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
31190 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
311a0 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
311b0 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
311c0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
311d0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
311e0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
311f0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
31200 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
31210 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
31220 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
31230 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
31240 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
31250 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
31260 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
31270 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
31280 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20  evious(pCur);.  
31290 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
312a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
312b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
312c0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
312d0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
312e0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
312f0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
31300 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
31310 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
31320 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
31330 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
31340 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
31350 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
31360 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
31370 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
31380 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
31390 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
313a0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
313b0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
313c0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
313d0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
313e0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
313f0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
31400 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
31410 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
31420 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
31430 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
31440 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
31450 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
31460 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
31470 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
31480 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
31490 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
314a0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
314b0 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
314c0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
314d0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
314e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
314f0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
31500 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
31510 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
31520 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
31530 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
31540 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
31550 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
31560 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
31570 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
31580 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
31590 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
315a0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
315b0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
315c0 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
315d0 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
315e0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
315f0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
31600 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
31610 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
31620 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
31630 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
31640 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
31650 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
31660 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
31670 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
31680 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
31690 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
316a0 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
316b0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
316c0 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
316d0 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
316e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
316f0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
31700 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
31710 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
31720 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
31730 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
31740 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
31750 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31760 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
31770 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
31780 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
31790 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
317a0 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
317b0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
317c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
317d0 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
317e0 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
317f0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
31800 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
31810 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
31820 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
31830 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
31840 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
31850 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
31860 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
31870 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
31880 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
31890 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
318a0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
318b0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
318c0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
318d0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
318e0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
318f0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
31900 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
31910 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
31920 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31930 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
31940 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31950 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
31960 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
31970 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
31980 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
31990 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
319a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
319b0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
319c0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
319d0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
319e0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
319f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
31a00 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
31a10 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
31a20 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
31a30 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
31a40 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
31a50 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
31a60 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31a70 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
31a80 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31a90 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
31aa0 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
31ab0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
31ac0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
31ad0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31ae0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
31af0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
31b00 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
31b10 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
31b20 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
31b30 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
31b40 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
31b50 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
31b60 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
31b70 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
31b80 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
31b90 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
31ba0 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
31bb0 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
31bc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
31bd0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
31be0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
31bf0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
31c00 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
31c10 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
31c20 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
31c30 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
31c40 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
31c50 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
31c60 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
31c70 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
31c80 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
31c90 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
31ca0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
31cb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31cc0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
31cd0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31ce0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
31cf0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
31d00 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
31d10 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
31d20 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
31d30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31d40 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
31d50 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
31d60 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
31d70 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
31d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
31d90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31da0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
31db0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
31dc0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
31dd0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
31de0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31df0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
31e00 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31e10 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
31e20 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
31e30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
31e40 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
31e50 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
31e60 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
31e70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
31e80 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
31e90 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
31ea0 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
31eb0 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
31ec0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
31ed0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31ee0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
31ef0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31f00 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31f10 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
31f20 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
31f30 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
31f40 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
31f50 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
31f60 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
31f70 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
31f80 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
31f90 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
31fa0 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
31fb0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
31fc0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
31fd0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
31fe0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
31ff0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
32000 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
32010 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
32020 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
32030 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
32040 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
32050 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
32060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
32070 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
32080 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
32090 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
320a0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
320b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
320c0 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
320d0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
320e0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
320f0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
32100 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
32110 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
32120 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
32130 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
32140 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
32150 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
32160 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
32170 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
32180 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
32190 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
321a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
321b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
321c0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
321d0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
321e0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
321f0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
32200 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
32210 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
32220 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
32230 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
32240 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
32250 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
32260 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
32270 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
32280 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
32290 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
322a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
322b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
322c0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
322d0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
322e0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
322f0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
32300 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
32310 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
32320 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
32330 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
32340 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
32350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32360 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32370 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
32380 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
32390 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
323a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
323b0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
323c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
323d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
323e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
323f0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
32400 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32410 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
32420 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
32430 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
32440 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
32450 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
32460 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
32470 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
32480 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
32490 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
324a0 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
324b0 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
324c0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
324d0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
324e0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
324f0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
32500 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
32510 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
32520 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
32530 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
32540 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
32550 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
32560 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
32570 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
32580 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
32590 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
325a0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
325b0 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
325c0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
325d0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
325e0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
325f0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
32600 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
32610 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
32620 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32630 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
32640 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
32650 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
32660 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
32670 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32680 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
32690 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
326a0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
326b0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
326c0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
326d0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
326e0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
326f0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
32700 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
32710 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
32720 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
32730 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
32740 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
32750 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
32760 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
32770 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32780 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
32790 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
327a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
327b0 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
327c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
327d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
327e0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
327f0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
32800 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
32810 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
32820 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
32830 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
32840 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
32850 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
32860 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
32870 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
32880 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
32890 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
328a0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
328b0 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
328c0 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
328d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
328e0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
328f0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
32900 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
32910 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32920 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32930 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32940 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32950 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32960 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
32970 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32980 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
32990 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
329a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
329b0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
329c0 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
329d0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
329e0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
329f0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32a00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32a10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32a20 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32a30 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
32a40 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32a50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32a60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32a70 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32a80 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32a90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32aa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32ab0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32ac0 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
32ad0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32ae0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32b00 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
32b10 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
32b20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
32b30 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
32b40 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
32b50 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
32b60 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
32b70 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
32b80 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
32b90 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
32ba0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
32bb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
32bc0 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
32bd0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
32be0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
32bf0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
32c00 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
32c10 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
32c20 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
32c30 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32c40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
32c50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
32c60 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32c70 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32c80 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32c90 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32ca0 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
32cb0 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
32cc0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32cd0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
32ce0 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
32cf0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
32d00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32d10 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32d20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32d30 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32d60 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
32d70 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32d80 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32d90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32da0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32db0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32dd0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32de0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
32df0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32e00 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32e10 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
32e20 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32e30 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32e40 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32e50 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
32e60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32e70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
32e80 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
32e90 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
32ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
32eb0 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
32ec0 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
32ed0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
32ee0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
32ef0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32f00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32f10 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
32f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
32f30 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32f40 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
32f50 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32f70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32f80 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
32f90 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32fb0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
32fc0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32fd0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32fe0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32ff0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
33000 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
33010 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
33020 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
33030 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33040 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
33050 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
33060 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
33070 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
33080 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
33090 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
330a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
330b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
330c0 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
330d0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
330e0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
330f0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
33100 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
33110 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
33120 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
33130 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
33140 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
33150 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
33160 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
33170 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
33180 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
33190 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
331a0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
331b0 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
331c0 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
331d0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
331e0 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
331f0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
33200 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
33220 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
33230 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
33240 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
33250 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33260 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
33270 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
33280 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
33290 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
332a0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
332b0 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
332c0 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
332d0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
332e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
332f0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
33300 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
33310 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
33320 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
33330 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33340 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
33350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
33360 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
33370 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
33380 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
33390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
333a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
333b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
333c0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
333d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
333e0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
333f0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
33400 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
33410 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
33420 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
33430 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
33440 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
33450 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
33460 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
33470 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
33480 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
33490 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
334a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
334b0 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
334c0 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
334d0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
334e0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
334f0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
33500 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
33510 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
33520 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
33530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
33540 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
33550 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
33560 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
33570 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
33580 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
33590 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
335a0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
335b0 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
335c0 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
335d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335e0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
335f0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
33600 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
33610 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
33620 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
33630 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
33640 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
33650 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
33660 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
33670 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
33680 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
33690 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
336a0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
336b0 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
336c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
336d0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
336e0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
336f0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
33700 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
33710 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
33720 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
33730 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
33740 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
33750 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
33760 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
33770 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
33780 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
33790 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
337a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
337b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
337c0 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
337d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
337e0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
337f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33800 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
33810 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
33830 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33840 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33850 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33860 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
33870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33880 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
33890 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
338a0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
338b0 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
338c0 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
338d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
338e0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
338f0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
33900 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
33910 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
33920 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33930 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
33940 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
33950 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
33960 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
33970 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
33980 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
33990 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
339a0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
339b0 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
339c0 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
339d0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
339e0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
339f0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
33a00 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
33a10 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
33a20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
33a30 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
33a40 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
33a50 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
33a60 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
33a70 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
33a80 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
33a90 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
33aa0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
33ab0 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33ac0 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
33ad0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
33ae0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
33af0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
33b00 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
33b10 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
33b20 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
33b30 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
33b40 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
33b50 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
33b60 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
33b70 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
33b80 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
33b90 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
33ba0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
33bb0 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
33bc0 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
33bd0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
33be0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
33bf0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
33c00 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
33c10 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33c20 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
33c30 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
33c40 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
33c50 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
33c60 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
33c70 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
33c80 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
33c90 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
33ca0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
33cb0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
33cc0 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
33cd0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33ce0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
33cf0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
33d00 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
33d10 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
33d20 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
33d30 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
33d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33d50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
33d60 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
33d70 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33d80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
33d90 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
33da0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33db0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33dc0 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
33dd0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
33de0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33df0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33e00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33e10 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
33e20 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
33e30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
33e40 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
33e50 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
33e60 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
33e70 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
33e80 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
33e90 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
33ea0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
33eb0 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
33ec0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
33ed0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
33ee0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
33ef0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
33f00 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
33f10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
33f20 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
33f30 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33f40 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
33f50 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
33f60 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
33f70 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
33f80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33f90 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
33fa0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33fb0 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
33fc0 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
33fd0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
33fe0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
33ff0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
34000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34010 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
34020 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
34030 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
34040 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
34050 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
34060 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
34070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34080 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
34090 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
340a0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
340b0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
340c0 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
340d0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
340e0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
340f0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
34100 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
34110 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
34120 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
34130 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
34140 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
34150 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
34160 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
34170 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
34180 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
34190 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
341a0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
341b0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
341c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
341d0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
341e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
341f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
34210 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
34220 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
34230 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
34240 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
34250 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
34260 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
34270 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
34280 44 42 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50 45  DB || *pPgno!=PE
34290 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
342a0 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
342b0 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
342c0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
342d0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
342e0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
342f0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
34300 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
34310 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
34320 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
34330 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73  Page)<=1 );.  as
34340 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
34350 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  _OK || (*ppPage)
34360 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
34370 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34380 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34390 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
343a0 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
343b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
343c0 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
343d0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
343e0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
343f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
34400 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
34410 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
34420 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
34430 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
34440 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
34450 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
34460 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
34470 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
34480 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
34490 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
344a0 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
344b0 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
344c0 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
344d0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
344e0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
344f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
34500 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
34510 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
34520 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
34530 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
34540 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
34550 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
34560 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
34570 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
34580 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
34590 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
345a0 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
345b0 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
345c0 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
345d0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
345e0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
345f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
34600 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
34610 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
34620 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
34630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34640 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
34650 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
34660 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
34670 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
34680 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
34690 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
346a0 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
346b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
346c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346d0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
346e0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
346f0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
34700 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
34710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34720 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
34730 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34750 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
34760 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
34770 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
34780 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
34790 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
347a0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
347b0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
347c0 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29  _DB || iPage>1 )
347d0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
347e0 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
347f0 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
34800 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32  ;..  if( iPage<2
34810 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
34820 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
34830 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b   if( pMemPage ){
34840 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65  .    pPage = pMe
34850 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74  mPage;.    sqlit
34860 65 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65  e3PagerRef(pPage
34870 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65  ->pDbPage);.  }e
34880 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  lse{.    pPage =
34890 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
348a0 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
348b0 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
348c0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
348d0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
348e0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
348f0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
34900 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
34910 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
34920 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46  eepage_out;.  nF
34930 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  ree = get4byte(&
34940 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
34950 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  ]);.  put4byte(&
34960 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
34970 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20  ], nFree+1);..  
34980 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
34990 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
349a0 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20  ELETE ){.    /* 
349b0 49 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  If the secure_de
349c0 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  lete option is e
349d0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  nabled, then.   
349e0 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79   ** always fully
349f0 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   overwrite delet
34a00 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
34a10 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a  ith zeros..    *
34a20 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  /.    if( (!pPag
34a30 65 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65  e && ((rc = btre
34a40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
34a50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29  age, &pPage, 0))
34a60 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20  !=0) ).     ||  
34a70 20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d            ((rc =
34a80 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
34a90 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
34aa0 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20  e))!=0).    ){. 
34ab0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
34ac0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
34ad0 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e    memset(pPage->
34ae0 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d  aData, 0, pPage-
34af0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  >pBt->pageSize);
34b00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
34b10 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
34b20 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
34b30 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
34b40 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
34b50 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
34b60 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
34b70 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
34b80 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
34b90 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70  UM ){.    ptrmap
34ba0 50 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20  Put(pBt, iPage, 
34bb0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
34bc0 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66   0, &rc);.    if
34bd0 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65  ( rc ) goto free
34be0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  page_out;.  }.. 
34bf0 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61   /* Now manipula
34c00 74 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  te the actual da
34c10 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
34c20 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72   structure. Ther
34c30 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70  e are two.  ** p
34c40 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66  ossibilities. If
34c50 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34c60 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74  s currently empt
34c70 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72  y, or if the fir
34c80 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61  st.  ** trunk pa
34c90 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
34ca0 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65  ist is full, the
34cb0 6e 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c  n this page will
34cc0 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e   become a.  ** n
34cd0 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  ew free-list tru
34ce0 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69  nk page. Otherwi
34cf0 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f  se, it will beco
34d00 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  me a leaf of the
34d10 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
34d20 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75  k page in the cu
34d30 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e  rrent free-list.
34d40 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
34d50 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20  s if it.  ** is 
34d60 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
34d70 74 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65  the page as a ne
34d80 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  w free-list leaf
34d90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72  ..  */.  if( nFr
34da0 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32  ee!=0 ){.    u32
34db0 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20   nLeaf;         
34dc0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
34dd0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  l number of leaf
34de0 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20   cells on trunk 
34df0 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72  page */..    iTr
34e00 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
34e10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
34e20 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72  ]);.    rc = btr
34e30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
34e40 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
34e50 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
34e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34e70 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
34e80 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
34e90 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74   nLeaf = get4byt
34ea0 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
34eb0 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [4]);.    assert
34ec0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
34ed0 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20  e>32 );.    if( 
34ee0 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74  nLeaf > (u32)pBt
34ef0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d  ->usableSize/4 -
34f00 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d   2 ){.      rc =
34f10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
34f20 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
34f30 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
34f40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65     }.    if( nLe
34f50 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75  af < (u32)pBt->u
34f60 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
34f70 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  ){.      /* In t
34f80 68 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69  his case there i
34f90 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72  s room on the tr
34fa0 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65  unk page to inse
34fb0 72 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  rt the page.    
34fc0 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64    ** being freed
34fd0 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a   as a new leaf..
34fe0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
34ff0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
35000 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f  trunk page is no
35010 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e  t really full un
35020 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a  til it contains.
35030 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53        ** usableS
35040 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65  ize/4 - 2 entrie
35050 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a  s, not usableSiz
35060 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20  e/4 - 8 entries 
35070 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20  as we have.     
35080 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20   ** coded.  But 
35090 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20  due to a coding 
350a0 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e  error in version
350b0 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f  s of SQLite prio
350c0 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e  r to.      ** 3.
350d0 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77  6.0, databases w
350e0 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75  ith freelist tru
350f0 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67  nk pages holding
35100 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20   more than.     
35110 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34   ** usableSize/4
35120 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c   - 8 entries wil
35130 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73  l be reported as
35140 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72   corrupt.  In or
35150 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  der.      ** to 
35160 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72  maintain backwar
35170 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  ds compatibility
35180 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73   with older vers
35190 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a  ions of SQLite,.
351a0 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c        ** we will
351b0 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73   continue to res
351c0 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
351d0 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
351e0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
351f0 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
35200 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
35210 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
35220 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
35230 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
35240 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
35250 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
35260 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
35270 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
35280 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
35290 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
352a0 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
352b0 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
352c0 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  4-8"..      **. 
352d0 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
352e0 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35  -OF: R-19920-115
352f0 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65  76 However, newe
35300 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
35310 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20  Lite still.     
35320 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20   ** avoid using 
35330 74 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74  the last six ent
35340 72 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65  ries in the free
35350 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20  list trunk page 
35360 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a  array in.      *
35370 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74  * order that dat
35380 61 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61  abase files crea
35390 74 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72  ted by newer ver
353a0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
353b0 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  can be.      ** 
353c0 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65  read by older ve
353d0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
353e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
353f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
35400 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
35410 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
35420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
35440 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
35450 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31  Data[4], nLeaf+1
35460 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
35470 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
35480 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69  ta[8+nLeaf*4], i
35490 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
354a0 66 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74  f( pPage && (pBt
354b0 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
354c0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d  _SECURE_DELETE)=
354d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
354e0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
354f0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
35500 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
35510 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74  .        rc = bt
35520 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeSetHasContent
35530 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20  (pBt, iPage);.  
35540 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
35550 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
35560 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
35570 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
35580 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
35590 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74  gno));.      got
355a0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
355b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
355c0 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73  If control flows
355d0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
355e0 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20  then it was not 
355f0 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20  possible to add 
35600 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  the.  ** the pag
35610 65 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  e being freed as
35620 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20   a leaf page of 
35630 74 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20  the first trunk 
35640 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
35650 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20  ..  ** Possibly 
35660 62 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65  because the free
35670 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20  -list is empty, 
35680 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61  or possibly beca
35690 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69  use the .  ** fi
356a0 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65  rst trunk in the
356b0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
356c0 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20  ll. Either way, 
356d0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
356e0 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  reed.  ** will b
356f0 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69  ecome the new fi
35700 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
35710 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
35720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
35730 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f  e==0 && SQLITE_O
35740 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65  K!=(rc = btreeGe
35750 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
35760 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b  , &pPage, 0)) ){
35770 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
35780 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63  ge_out;.  }.  rc
35790 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
357a0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
357b0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
357c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
357d0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
357e0 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79  ut;.  }.  put4by
357f0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
35800 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34   iTrunk);.  put4
35810 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
35820 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74  ta[4], 0);.  put
35830 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
35840 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29  Data[32], iPage)
35850 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45  ;.  TRACE(("FREE
35860 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72  -PAGE: %d new tr
35870 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69  unk page replaci
35880 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  ng %d\n", pPage-
35890 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b  >pgno, iTrunk));
358a0 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a  ..freepage_out:.
358b0 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
358c0 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
358d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65   = 0;.  }.  rele
358e0 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
358f0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
35900 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  runk);.  return 
35910 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  rc;.}.static voi
35920 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61  d freePage(MemPa
35930 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a  ge *pPage, int *
35940 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52  pRC){.  if( (*pR
35950 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  C)==SQLITE_OK ){
35960 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65  .    *pRC = free
35970 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74  Page2(pPage->pBt
35980 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e  , pPage, pPage->
35990 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  pgno);.  }.}../*
359a0 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
359b0 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
359c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
359d0 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53 74 6f  given Cell.  Sto
359e0 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66 6f 72  re.** size infor
359f0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
35a00 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a   cell in pInfo..
35a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
35a20 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
35a30 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
35a40 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
35a50 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
35a60 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
35a70 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
35a80 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
35a90 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
35aa0 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
35ab0 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo          /* 
35ac0 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  Size information
35ad0 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c 20   about the cell 
35ae0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
35af0 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76   *pBt;.  Pgno ov
35b00 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  flPgno;.  int rc
35b10 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20  ;.  int nOvfl;. 
35b20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a   u32 ovflPageSiz
35b30 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  e;..  assert( sq
35b40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
35b50 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
35b60 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e  ex) );.  pPage->
35b70 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
35b80 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
35b90 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c  .  if( pInfo->nL
35ba0 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61  ocal==pInfo->nPa
35bb0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74  yload ){.    ret
35bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  urn SQLITE_OK;  
35bd0 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  /* No overflow p
35be0 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74  ages. Return wit
35bf0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68  hout doing anyth
35c00 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73  ing */.  }.  tes
35c10 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b 20 70  tcase( pCell + p
35c20 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20 70  Info->nSize == p
35c30 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
35c40 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 43  ;.  testcase( pC
35c50 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 53  ell + (pInfo->nS
35c60 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67 65 2d  ize-1) == pPage-
35c70 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 69  >aDataEnd );.  i
35c80 66 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f  f( pCell + pInfo
35c90 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d  ->nSize > pPage-
35ca0 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20  >aDataEnd ){.   
35cb0 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
35cc0 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
35cd0 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
35ce0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
35cf0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
35d00 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
35d10 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49  4byte(pCell + pI
35d20 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b  nfo->nSize - 4);
35d30 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
35d40 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  pBt;.  assert( p
35d50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
35d60 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
35d70 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
35d80 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
35d90 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50  vfl = (pInfo->nP
35da0 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e  ayload - pInfo->
35db0 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67  nLocal + ovflPag
35dc0 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50  eSize - 1)/ovflP
35dd0 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72  ageSize;.  asser
35de0 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20  t( nOvfl>0 || . 
35df0 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26     (CORRUPT_DB &
35e00 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  & (pInfo->nPaylo
35e10 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
35e20 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
35e30 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
35e40 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
35e50 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
35e60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
35e70 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
35e80 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
35e90 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
35ea0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
35eb0 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
35ec0 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
35ed0 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
35ee0 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
35ef0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
35f00 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
35f10 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
35f20 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
35f30 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
35f40 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
35f50 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
35f60 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
35f70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
35f80 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
35f90 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
35fa0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
35fb0 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
35fc0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
35fd0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
35fe0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
35ff0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
36000 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
36010 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
36020 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
36030 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
36040 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
36050 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
36060 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
36070 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
36080 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
36090 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
360a0 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
360b0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
360c0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
360d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
360e0 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
360f0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
36100 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
36110 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
36120 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
36130 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
36140 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
36150 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
36160 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
36170 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
36180 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
36190 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
361a0 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
361b0 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
361c0 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
361d0 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
361e0 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
361f0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
36200 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
36210 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
36220 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
36230 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
36240 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
36250 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
36260 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
36270 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
36280 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
36290 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
362a0 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
362b0 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
362c0 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
362d0 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
362e0 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
362f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
36300 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
36310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36320 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
36330 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
36340 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
36350 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
36360 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
36370 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
36380 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
36390 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
363a0 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
363b0 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
363c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
363d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
363e0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
363f0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
36400 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
36410 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
36420 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
36430 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
36440 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
36450 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
36460 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
36470 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
36480 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
36490 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
364a0 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
364b0 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
364c0 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
364d0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
364e0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
364f0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
36500 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
36510 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
36520 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
36530 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
36540 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
36550 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
36560 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
36570 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
36580 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
36590 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
365a0 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
365b0 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
365c0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
365d0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
365e0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
365f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
36600 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
36610 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
36620 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
36630 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
36640 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
36650 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
36660 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
36670 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
36680 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20 2a 70   BtreePayload *p
36690 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 79  X,        /* Pay
366a0 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63 68 20  load with which 
366b0 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65  to construct the
366c0 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a   cell */.  int *
366d0 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20  pnSize          
366e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
366f0 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72  te cell size her
36700 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  e */.){.  int nP
36710 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20  ayload;.  const 
36720 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20  u8 *pSrc;.  int 
36730 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b  nSrc, n, rc, mn;
36740 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
36750 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
36760 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73 69 67  Release;.  unsig
36770 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
36780 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
36790 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
367a0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20  tShared *pBt;.  
367b0 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20  Pgno pgnoOvfl;. 
367c0 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20   int nHeader;.. 
367d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
367e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
367f0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
36800 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73  ;..  /* pPage is
36810 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
36820 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65   writeable since
36830 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20   pCell might be 
36840 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62  auxiliary.  ** b
36850 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61 74  uffer space that
36860 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72 6f   is separate fro
36870 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66 66  m the pPage buff
36880 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73  er area */.  ass
36890 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65  ert( pCell<pPage
368a0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c  ->aData || pCell
368b0 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
368c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
368d0 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20  Size].          
368e0 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65    || sqlite3Page
368f0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
36900 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
36910 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
36920 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
36930 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e  Header = pPage->
36940 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
36950 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
36960 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  y ){.    nPayloa
36970 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20  d = pX->nData + 
36980 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70  pX->nZero;.    p
36990 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b  Src = pX->pData;
369a0 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e  .    nSrc = pX->
369b0 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72  nData;.    asser
369c0 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
369d0 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49  Leaf ); /* fillI
369e0 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c  nCell() only cal
369f0 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73 20 2a  led for leaves *
36a00 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  /.    nHeader +=
36a10 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70 43   putVarint32(&pC
36a20 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50  ell[nHeader], nP
36a30 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65  ayload);.    nHe
36a40 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
36a50 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  t(&pCell[nHeader
36a60 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e  ], *(u64*)&pX->n
36a70 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Key);.  }else{. 
36a80 20 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6e     assert( pX->n
36a90 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20  Key<=0x7fffffff 
36aa0 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29  && pX->pKey!=0 )
36ab0 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 50 61  ;.    nSrc = nPa
36ac0 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70 58 2d  yload = (int)pX-
36ad0 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  >nKey;.    pSrc 
36ae0 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20  = pX->pKey;.    
36af0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
36b00 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
36b10 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
36b20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  );.  }.  .  /* F
36b30 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
36b40 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64  ad */.  pPayload
36b50 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
36b60 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  r];.  if( nPaylo
36b70 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
36b80 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
36b90 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e  is is the common
36ba0 20 63 61 73 65 20 77 68 65 72 65 20 65 76 65 72   case where ever
36bb0 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e 20 74  ything fits on t
36bc0 68 65 20 62 74 72 65 65 20 70 61 67 65 0a 20 20  he btree page.  
36bd0 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72    ** and no over
36be0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 72  flow pages are r
36bf0 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20  equired. */.    
36c00 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50  n = nHeader + nP
36c10 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74  ayload;.    test
36c20 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20  case( n==3 );.  
36c30 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34    testcase( n==4
36c40 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20   );.    if( n<4 
36c50 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e  ) n = 4;.    *pn
36c60 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73  Size = n;.    as
36c70 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79  sert( nSrc<=nPay
36c80 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65 73 74  load );.    test
36c90 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c  case( nSrc<nPayl
36ca0 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70  oad );.    memcp
36cb0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
36cc0 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d  , nSrc);.    mem
36cd0 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72  set(pPayload+nSr
36ce0 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e  c, 0, nPayload-n
36cf0 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Src);.    return
36d00 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
36d10 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63  .  /* If we reac
36d20 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74  h this point, it
36d30 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65   means that some
36d40 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
36d50 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74  will need.  ** t
36d60 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65  o spill onto ove
36d70 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
36d80 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e  /.  mn = pPage->
36d90 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20  minLocal;.  n = 
36da0 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
36db0 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
36dc0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
36dd0 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28   4);.  testcase(
36de0 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f   n==pPage->maxLo
36df0 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
36e00 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
36e10 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
36e20 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c   n > pPage->maxL
36e30 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20  ocal ) n = mn;. 
36e40 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a   spaceLeft = n;.
36e50 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20    *pnSize = n + 
36e60 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 70  nHeader + 4;.  p
36e70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
36e80 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f  Header+n];.  pTo
36e90 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 70  Release = 0;.  p
36ea0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70  gnoOvfl = 0;.  p
36eb0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
36ec0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
36ed0 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73 20 73  oint variables s
36ee0 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61 73 20  hould be set as 
36ef0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20  follows:.  **.  
36f00 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20 20 20  **   nPayload   
36f10 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20 70 61          Total pa
36f20 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20 62 79  yload size in by
36f30 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c  tes.  **   pPayl
36f40 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 42 65  oad           Be
36f50 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61 79 6c  gin writing payl
36f60 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20 20 20  oad here.  **   
36f70 73 70 61 63 65 4c 65 66 74 20 20 20 20 20 20 20  spaceLeft       
36f80 20 20 20 53 70 61 63 65 20 61 76 61 69 6c 61 62     Space availab
36f90 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64 2e 20  le at pPayload. 
36fa0 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61   If nPayload>spa
36fb0 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20  ceLeft,.  **    
36fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fd0 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e    that means con
36fe0 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c 6c 20  tent must spill 
36ff0 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  into overflow pa
37000 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53  ges..  **   *pnS
37010 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 53  ize            S
37020 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c  ize of the local
37030 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74   cell (not count
37040 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ing overflow pag
37050 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f  es).  **   pPrio
37060 72 20 20 20 20 20 20 20 20 20 20 20 20 20 57 68  r             Wh
37070 65 72 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ere to write the
37080 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66 69 72   pgno of the fir
37090 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
370a0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61  .  **.  ** Use a
370b0 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 50 61   call to btreePa
370c0 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74 6f 20  rseCellPtr() to 
370d0 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
370e0 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20 20 2a  values above.  *
370f0 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 20  * were computed 
37100 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
37110 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
37120 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c  BUG.  {.    Cell
37130 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70  Info info;.    p
37140 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
37150 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
37160 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  info);.    asser
37170 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74  t( nHeader==(int
37180 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20  )(info.pPayload 
37190 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20  - pCell) );.    
371a0 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
371b0 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20  y==pX->nKey );. 
371c0 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
371d0 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
371e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
371f0 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
37200 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a  o.nLocal );.  }.
37210 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
37220 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
37230 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
37240 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
37250 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
37260 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
37270 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50   1 ){.    n = nP
37280 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20  ayload;.    if( 
37290 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20  n>spaceLeft ) n 
372a0 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20  = spaceLeft;..  
372b0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
372c0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
372d0 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69  han pPayload poi
372e0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
372f0 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66  a area.    ** of
37300 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
37310 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
37320 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
37330 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73  eable. */.    as
37340 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
37350 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
37360 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37370 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
37380 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ge) );..    /* I
37390 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61  f pPayload is pa
373a0 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
373b0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
373c0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
373d0 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  ge.    ** is sti
373e0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
373f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79      assert( pPay
37400 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74  load<pPage->aDat
37410 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26  a || pPayload>=&
37420 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
37430 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
37440 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
37450 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37460 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
37470 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e  e) );..    if( n
37480 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Src>=n ){.      
37490 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
374a0 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
374b0 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e 30 20  else if( nSrc>0 
374c0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e 53 72  ){.      n = nSr
374d0 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  c;.      memcpy(
374e0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
374f0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
37500 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
37510 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
37520 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
37530 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50  -= n;.    if( nP
37540 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72 65 61  ayload<=0 ) brea
37550 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20  k;.    pPayload 
37560 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b  += n;.    pSrc +
37570 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d  = n;.    nSrc -=
37580 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
37590 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  t -= n;.    if( 
375a0 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a  spaceLeft==0 ){.
375b0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
375c0 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Ovfl = 0;.#ifnde
375d0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
375e0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50  TOVACUUM.      P
375f0 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d  gno pgnoPtrmap =
37600 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76   pgnoOvfl; /* Ov
37610 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
37620 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61  ter-map entry pa
37630 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ge */.      if( 
37640 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
37650 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20  ){.        do{. 
37660 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66           pgnoOvf
37670 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77  l++;.        } w
37680 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20  hile( .         
37690 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
376a0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c  Bt, pgnoOvfl) ||
376b0 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49   pgnoOvfl==PENDI
376c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
376d0 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  ) .        );.  
376e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
376f0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
37700 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
37710 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c  pOvfl, &pgnoOvfl
37720 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a  , pgnoOvfl, 0);.
37730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37740 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
37750 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64       /* If the d
37760 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
37770 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e   auto-vacuum, an
37780 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20  d the second or 
37790 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20  subsequent.     
377a0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
377b0 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63  e is being alloc
377c0 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74  ated, add an ent
377d0 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ry to the pointe
377e0 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66  r-map.      ** f
377f0 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77  or that page now
37800 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
37810 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
37820 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
37830 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72  ow page, then wr
37840 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e  ite a partial en
37850 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f  try .      ** to
37860 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
37870 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f  . If we write no
37880 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f  thing to this po
37890 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a  inter-map slot,.
378a0 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
378b0 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65  e optimistic ove
378c0 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63  rflow chain proc
378d0 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43  essing in clearC
378e0 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d  ell().      ** m
378f0 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20  ay misinterpret 
37900 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  the uninitialize
37910 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c  d values and del
37920 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ete the.      **
37930 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f   wrong pages fro
37940 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  m the database..
37950 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
37960 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
37970 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  um && rc==SQLITE
37980 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75  _OK ){.        u
37990 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50  8 eType = (pgnoP
379a0 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45  trmap?PTRMAP_OVE
379b0 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56  RFLOW2:PTRMAP_OV
379c0 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20  ERFLOW1);.      
379d0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
379e0 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
379f0 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72  , pgnoPtrmap, &r
37a00 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
37a10 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
37a20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66  releasePage(pOvf
37a30 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
37a40 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
37a50 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
37a60 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
37a70 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20  (pToRelease);.  
37a80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
37a90 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
37aa0 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65  /* If pToRelease
37ab0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61   is not zero tha
37ac0 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20  n pPrior points 
37ad0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61 72  into the data ar
37ae0 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ea.      ** of p
37af0 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65  ToRelease.  Make
37b00 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65   sure pToRelease
37b10 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
37b20 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ble. */.      as
37b30 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65  sert( pToRelease
37b40 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61  ==0 || sqlite3Pa
37b50 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
37b60 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61  ToRelease->pDbPa
37b70 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ge) );..      /*
37b80 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70 61   If pPrior is pa
37b90 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61  rt of the data a
37ba0 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68  rea of pPage, th
37bb0 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61  en make sure pPa
37bc0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  ge.      ** is s
37bd0 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
37be0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
37bf0 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44  pPrior<pPage->aD
37c00 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26  ata || pPrior>=&
37c10 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
37c20 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20  ->pageSize].    
37c30 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74          || sqlit
37c40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37c50 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
37c60 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74  e) );..      put
37c70 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67  4byte(pPrior, pg
37c80 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72  noOvfl);.      r
37c90 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
37ca0 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54  lease);.      pT
37cb0 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c  oRelease = pOvfl
37cc0 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d  ;.      pPrior =
37cd0 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20   pOvfl->aData;. 
37ce0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50       put4byte(pP
37cf0 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rior, 0);.      
37d00 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66  pPayload = &pOvf
37d10 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20  l->aData[4];.   
37d20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70     spaceLeft = p
37d30 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
37d40 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   4;.    }.  }.  
37d50 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
37d60 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
37d70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
37d80 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
37d90 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
37da0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
37db0 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
37dc0 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
37dd0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
37de0 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
37df0 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
37e00 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
37e10 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
37e20 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
37e30 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
37e40 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
37e50 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
37e60 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
37e70 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
37e80 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
37e90 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
37ea0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
37eb0 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
37ec0 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
37ed0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
37ee0 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
37ef0 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  z, int *pRC){.  
37f00 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20  u32 pc;         
37f10 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c  /* Offset to cel
37f20 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c  l content of cel
37f30 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  l being deleted 
37f40 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
37f50 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61       /* pPage->a
37f60 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74  Data */.  u8 *pt
37f70 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  r;        /* Use
37f80 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20  d to move bytes 
37f90 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61  around within da
37fa0 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ta[] */.  int rc
37fb0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
37fc0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
37fd0 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
37fe0 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f    /* Beginning o
37ff0 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30  f the header.  0
38000 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30   most pages.  10
38010 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69  0 page 1 */..  i
38020 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
38030 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
38040 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d  =0 && idx<pPage-
38050 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
38060 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
38070 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  | sz==cellSize(p
38080 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
38090 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
380a0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
380b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
380c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
380d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
380e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
380f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
38100 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20  pPage->nFree>=0 
38110 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
38120 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
38130 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
38140 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
38150 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
38160 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
38170 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
38180 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
38190 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
381a0 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
381b0 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
381c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
381d0 3b 0a 20 20 69 66 28 20 70 63 2b 73 7a 20 3e 20  ;.  if( pc+sz > 
381e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
381f0 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70  leSize ){.    *p
38200 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
38210 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
38220 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
38230 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
38240 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
38250 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52 43 20   rc ){.    *pRC 
38260 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
38270 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e  ;.  }.  pPage->n
38280 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50  Cell--;.  if( pP
38290 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
382a0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
382b0 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b  a[hdr+1], 0, 4);
382c0 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
382d0 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32 62 79   = 0;.    put2by
382e0 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
382f0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
38300 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  bleSize);.    pP
38310 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61  age->nFree = pPa
38320 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
38330 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68 64 72  ize - pPage->hdr
38340 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20 20 20  Offset.         
38350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
38360 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
38370 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65  ize - 8;.  }else
38380 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74  {.    memmove(pt
38390 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70 50 61  r, ptr+2, 2*(pPa
383a0 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29  ge->nCell - idx)
383b0 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
383c0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50  &data[hdr+3], pP
383d0 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20  age->nCell);.   
383e0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
383f0 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   2;.  }.}../*.**
38400 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
38410 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
38420 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
38430 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
38440 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
38450 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
38460 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
38470 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
38480 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
38490 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
384a0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If