/ Hex Artifact Content
Login

Artifact 58574154361f57da015436f53d9107dde74387b3b939c7a7ef6a7998b5dfb1af:


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 61 73 73 65 72  Key ){.    asser
6da0: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6db0: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6dc0: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6dd0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6de0: 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b  dRecord(pCur->pK
6df0: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
6e00: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6e10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6e20: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
6e30: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
6e40: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
6e50: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
6e60: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
6e70: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
6e80: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
6e90: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
6ea0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6eb0: 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64     goto moveto_d
6ec0: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  one;.    }.  }el
6ed0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6ee0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6ef0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6f00: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6f10: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6f20: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76  bias, pRes);.mov
6f30: 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  eto_done:.  if( 
6f40: 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73  pIdxKey ){.    s
6f50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6f60: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6f70: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20   pIdxKey);.  }. 
6f80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f90: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6fa0: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6fb0: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6fc0: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6fd0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
6fe0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
6ff0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
7000: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
7010: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
7020: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7030: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7040: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7050: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7060: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7070: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7080: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7090: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
70a0: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
70b0: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
70c0: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
70d0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
70e0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
70f0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
7100: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
7110: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
7120: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
7130: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
7140: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7150: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
7160: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7170: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
7180: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
7190: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
71a0: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
71b0: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
71c0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
71d0: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
71e0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
71f0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
7200: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
7210: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
7220: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7230: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7240: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
7250: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
7260: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
7270: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7280: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
7290: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
72a0: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
72b0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
72c0: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
72d0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
72e0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
72f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
7300: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
7310: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
7320: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
7330: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7340: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
7350: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7360: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7370: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
7380: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
7390: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
73a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
73b0: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
73c0: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
73d0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
73e0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
73f0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
7400: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
7410: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
7420: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
7430: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
7440: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
7450: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
7460: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
7470: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
7480: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
7490: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
74a0: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
74b0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
74c0: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
74d0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
74e0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
74f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
7500: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
7510: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
7520: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
7530: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
7540: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
7550: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7560: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
7570: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
7580: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
7590: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
75a0: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
75b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
75c0: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
75d0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
75e0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
75f0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
7600: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
7610: 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20 20  IGNMENT(pCur).  
7620: 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73 71       || pCur==sq
7630: 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
7640: 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a 20  lidCursor() );. 
7650: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
7660: 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61  f(BtCursor, eSta
7670: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  te)==0 );.  asse
7680: 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  rt( sizeof(pCur-
7690: 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a 20  >eState)==1 );. 
76a0: 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f 56   return CURSOR_V
76b0: 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70 43  ALID != *(u8*)pC
76c0: 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ur;.}../*.** Ret
76d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
76e0: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
76f0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
7700: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
7710: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
7720: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7730: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
7740: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
7750: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
7760: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
7770: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
7780: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
7790: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
77a0: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
77b0: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
77c0: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
77d0: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
77e0: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
77f0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7800: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
7810: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
7820: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
7830: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
7840: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7850: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
7860: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
7870: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
7880: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
7890: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
78a0: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
78b0: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
78c0: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
78d0: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
78e0: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
78f0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
7900: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
7910: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
7920: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
7930: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
7940: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
7950: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
7960: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
7970: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
7980: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
7990: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
79a0: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
79b0: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
79c0: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
79d0: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
79e0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
79f0: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
7a00: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7a10: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
7a20: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
7a30: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
7a40: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
7a50: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
7a60: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7a70: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
7a80: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
7a90: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
7aa0: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
7ab0: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
7ac0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
7ad0: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
7ae0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7af0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7b00: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
7b10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7b20: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
7b30: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7b40: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
7b50: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
7b60: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
7b70: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
7b80: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7b90: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
7ba0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
7bb0: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
7bc0: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
7bd0: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7be0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bf0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7c00: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7c10: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7c20: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c30: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c40: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c50: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c60: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7c70: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7c80: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7c90: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7ca0: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7cb0: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7cc0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7cd0: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7ce0: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7cf0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7d00: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7d10: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7d20: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d30: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d40: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d50: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d60: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7d70: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7d80: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7d90: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7da0: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7db0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7dc0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7dd0: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7de0: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7df0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7e00: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7e10: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7e20: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e30: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e40: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e60: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7e70: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7e80: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7e90: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7ea0: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7eb0: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7ec0: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7ed0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7ee0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7ef0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7f00: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7f10: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7f20: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f30: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f40: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f50: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f60: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7f70: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7f80: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7f90: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7fa0: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7fb0: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7fc0: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7fd0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7fe0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7ff0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
8000: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
8010: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8020: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8030: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8040: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8050: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8060: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
8070: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
8080: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
8090: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
80a0: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
80b0: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
80c0: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
80d0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
80e0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
80f0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
8100: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
8110: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
8120: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8130: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8140: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8150: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8160: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
8170: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
8180: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
8190: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
81a0: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
81b0: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
81c0: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
81d0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
81e0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
81f0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
8200: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
8210: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
8220: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8230: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8240: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8250: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8260: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
8270: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8280: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8290: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
82a0: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
82b0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
82c0: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
82d0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
82e0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
82f0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
8300: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
8310: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
8320: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8330: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8340: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8350: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8360: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
8370: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8380: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
8390: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
83a0: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
83b0: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
83c0: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
83d0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
83e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83f0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
8400: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
8410: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
8420: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8430: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8440: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8450: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8460: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
8470: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
8480: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
8490: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
84a0: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
84b0: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
84c0: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
84d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
84e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
84f0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8500: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8510: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8520: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8530: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8540: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8550: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8560: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
8570: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8580: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
8590: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
85a0: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
85b0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
85c0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
85d0: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
85e0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
85f0: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
8600: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
8610: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
8620: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8630: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8640: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8650: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8660: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8670: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8680: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8690: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
86a0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
86b0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
86c0: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
86d0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
86e0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
86f0: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
8700: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
8710: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
8720: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8730: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8740: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8750: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8760: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
8770: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
8780: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
8790: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
87a0: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
87b0: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
87c0: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
87d0: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
87e0: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
87f0: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
8800: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
8810: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
8820: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8830: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8840: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8850: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8860: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8870: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
8880: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
8890: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
88a0: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
88b0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
88c0: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
88d0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
88e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
88f0: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
8900: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
8910: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
8920: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8930: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8940: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8950: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8960: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8970: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8980: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8990: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
89a0: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
89b0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
89c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
89d0: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
89e0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
89f0: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
8a00: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
8a10: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
8a20: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a30: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a40: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a50: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a60: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8a70: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8a80: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8a90: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8aa0: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8ab0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8ac0: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8ad0: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8ae0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8af0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8b00: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8b10: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8b20: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b40: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b50: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b60: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8b70: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8b80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8b90: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8ba0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8bb0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8bc0: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8bd0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8be0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8bf0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8c00: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8c10: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8c20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c30: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c40: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c50: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c60: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8c70: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8c80: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8c90: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8ca0: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8cb0: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8cc0: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8cd0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8ce0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8cf0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8d00: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8d10: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8d20: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d30: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d40: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d50: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d60: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8d70: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8d80: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d90: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8da0: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8db0: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8dc0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8dd0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8de0: 74 72 28 78 2c 20 79 2c 20 7a 2c 20 72 63 29 0a  tr(x, y, z, rc).
8df0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8e00: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8e10: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8e20: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
8e30: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
8e40: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
8e50: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
8e60: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
8e70: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
8e80: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8e90: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8ea0: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8eb0: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8ec0: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8ed0: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8ee0: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8ef0: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8f00: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8f10: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8f20: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8f30: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
8f40: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
8f50: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
8f60: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
8f70: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
8f80: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8f90: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8fa0: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8fb0: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8fc0: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8fd0: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8fe0: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8ff0: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
9000: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
9010: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
9020: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
9030: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
9040: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
9050: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
9060: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
9070: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
9080: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
9090: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
90a0: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
90b0: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
90c0: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
90d0: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
90e0: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
90f0: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
9100: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
9110: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
9120: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
9130: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
9140: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
9150: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9160: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
9170: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9180: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9190: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
91a0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
91c0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
91d0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
91e0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
91f0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
9200: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
9210: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
9220: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
9230: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
9240: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
9250: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
9260: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
9270: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
9280: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
9290: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
92a0: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
92b0: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
92c0: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
92d0: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
92e0: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
92f0: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
9300: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
9310: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
9320: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
9330: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
9340: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
9350: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
9360: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
9370: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
9380: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
9390: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
93a0: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
93b0: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
93c0: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
93d0: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
93e0: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
93f0: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
9400: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
9410: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
9420: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
9430: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
9440: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
9450: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
9460: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
9470: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
9480: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
9490: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
94a0: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
94b0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
94c0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
94d0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
94e0: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
94f0: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
9500: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
9510: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
9520: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
9530: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
9540: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
9550: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
9560: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
9570: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
9580: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
9590: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
95a0: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
95b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
95c0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
95d0: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
95e0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
95f0: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
9600: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
9610: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
9620: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
9630: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
9640: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
9650: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
9660: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
9670: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
9680: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
9690: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
96a0: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
96b0: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
96c0: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
96d0: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
96e0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
96f0: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
9700: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
9710: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
9720: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
9730: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9740: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9750: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
9760: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
9770: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
9780: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
9790: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
97a0: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
97b0: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
97c0: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
97d0: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
97e0: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
97f0: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
9800: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
9810: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
9820: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9830: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
9840: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
9850: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
9860: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
9870: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9890: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
98a0: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
98b0: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
98c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
98d0: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
98e0: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
98f0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
9900: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
9910: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9920: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
9930: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
9940: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9950: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
9960: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9970: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
9980: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
9990: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
99a0: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
99b0: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
99c0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
99d0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
99e0: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
99f0: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
9a00: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9a10: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
9a20: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
9a30: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
9a40: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
9a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
9a60: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9a70: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
9a80: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9a90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9aa0: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9ab0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9ac0: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9ad0: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9ae0: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9af0: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9b00: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9b10: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9b20: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
9b30: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
9b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
9b50: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
9b60: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
9b70: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
9b80: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9b90: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9ba0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9bb0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9bc0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9bd0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9be0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9bf0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9c00: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9c10: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9c20: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
9c30: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
9c40: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
9c50: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
9c60: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
9c70: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
9c80: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9c90: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9ca0: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9cb0: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9cc0: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9cd0: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9ce0: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9cf0: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9d00: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9d10: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9d20: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
9d30: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
9d40: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
9d50: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
9d60: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
9d70: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
9d80: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9d90: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9da0: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9db0: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9dc0: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9dd0: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9de0: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9df0: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9e00: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9e10: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9e20: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
9e30: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9e40: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9e50: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9e60: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9e70: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
9e80: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9e90: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9ea0: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9eb0: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9ec0: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9ed0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9ee0: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9ef0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9f00: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9f10: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9f20: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
9f30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
9f40: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
9f50: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
9f60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
9f70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
9f80: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9f90: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9fa0: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9fb0: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9fc0: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9fd0: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9fe0: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9ff0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a000: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a010: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a020: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a030: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a040: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a050: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a060: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a070: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a080: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a090: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a0a0: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a0b0: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a0c0: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a0d0: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a0e0: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a0f0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a100: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a110: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a120: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a130: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a140: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a150: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a160: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a170: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a180: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a190: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a1a0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a1b0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
a1c0: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
a1d0: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
a1e0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
a1f0: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
a200: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
a210: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
a220: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
a230: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
a240: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
a250: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
a260: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
a270: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a290: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
a2a0: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
a2b0: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
a2c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a2d0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
a2e0: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
a2f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a300: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
a310: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
a320: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
a330: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
a340: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
a350: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
a360: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
a370: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
a380: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
a390: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
a3a0: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
a3b0: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
a3c0: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
a3d0: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a3e0: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
a3f0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a400: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
a410: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
a420: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
a430: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
a440: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
a450: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
a460: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
a470: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
a480: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
a490: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
a4a0: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
a4b0: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
a4c0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
a4d0: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
a4e0: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
a4f0: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
a500: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
a510: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
a520: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
a530: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
a540: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
a550: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
a560: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
a570: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
a580: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
a590: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
a5a0: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
a5b0: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
a5c0: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
a5d0: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
a5e0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a5f0: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
a600: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
a610: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
a620: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
a630: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
a640: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
a650: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
a660: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
a670: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
a680: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
a690: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
a6a0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a6b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
a6c0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
a6d0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
a6e0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
a6f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
a700: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
a710: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
a720: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
a730: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
a740: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
a750: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
a760: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
a770: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
a780: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
a790: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
a7a0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
a7b0: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
a7c0: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
a7d0: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
a7e0: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
a7f0: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
a800: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
a810: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
a820: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
a830: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
a840: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
a850: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
a860: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
a870: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
a880: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
a890: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
a8a0: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
a8b0: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
a8c0: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
a8d0: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
a8e0: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
a8f0: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
a900: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
a910: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
a920: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
a930: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
a940: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
a950: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
a960: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a970: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
a980: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
a990: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
a9a0: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
a9b0: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
a9c0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
a9d0: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
a9e0: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa10: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
aa20: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
aa30: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
aa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa50: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
aa60: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
aa70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
aa80: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
aa90: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
aaa0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
aab0: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
aac0: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
aad0: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
aae0: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
aaf0: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
ab00: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
ab10: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
ab20: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
ab30: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
ab40: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
ab50: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
ab60: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
ab70: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
ab80: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
ab90: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
aba0: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
abb0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
abc0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
abd0: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
abe0: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
abf0: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
ac00: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
ac10: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
ac20: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
ac30: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
ac40: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
ac50: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
ac60: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
ac70: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
ac80: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ac90: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
aca0: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
acb0: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
acc0: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
acd0: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
ace0: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
acf0: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
ad00: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
ad10: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
ad20: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
ad30: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
ad40: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
ad50: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
ad60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
ad70: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
ad80: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
ad90: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
ada0: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
adb0: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
adc0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
add0: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
ade0: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
adf0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
ae00: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
ae10: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
ae20: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
ae30: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
ae40: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
ae50: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
ae60: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
ae70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
ae80: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
ae90: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
aea0: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
aeb0: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
aec0: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
aed0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
aee0: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
aef0: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
af00: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
af10: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af20: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af30: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
af40: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
af50: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
af60: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
af70: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
af80: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
af90: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
afa0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
afb0: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
afc0: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
afd0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
afe0: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
aff0: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
b000: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
b010: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
b020: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
b030: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
b040: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
b050: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
b060: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
b070: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b080: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
b090: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
b0a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
b0b0: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
b0c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
b0d0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
b0e0: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
b0f0: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
b100: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
b110: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
b120: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
b130: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
b140: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
b150: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
b160: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
b170: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
b180: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
b190: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
b1a0: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
b1b0: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
b1c0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
b1d0: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
b1e0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
b1f0: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
b200: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
b210: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
b220: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
b230: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
b240: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
b250: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
b260: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
b270: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
b280: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
b290: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
b2a0: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
b2b0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
b2c0: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
b2d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
b2e0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
b2f0: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
b300: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
b310: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
b320: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
b330: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
b340: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
b350: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
b360: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
b370: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b380: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
b390: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
b3a0: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
b3b0: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
b3c0: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
b3d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b3e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
b3f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20  ./*.** The cell 
b400: 70 43 65 6c 6c 20 69 73 20 63 75 72 72 65 6e 74  pCell is current
b410: 6c 79 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  ly part of page 
b420: 70 53 72 63 20 62 75 74 20 77 69 6c 6c 20 75 6c  pSrc but will ul
b430: 74 69 6d 61 74 65 6c 79 20 62 65 20 70 61 72 74  timately be part
b440: 0a 2a 2a 20 6f 66 20 70 50 61 67 65 2e 20 20 28  .** of pPage.  (
b450: 70 53 72 63 20 61 6e 64 20 70 50 61 67 65 72 20  pSrc and pPager 
b460: 61 72 65 20 6f 66 74 65 6e 20 74 68 65 20 73 61  are often the sa
b470: 6d 65 2e 29 20 20 49 66 20 70 43 65 6c 6c 20 63  me.)  If pCell c
b480: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 70 6f 69  ontains a.** poi
b490: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
b4a0: 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74  low page, insert
b4b0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
b4c0: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
b4d0: 6f 72 0a 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c  or.** the overfl
b4e0: 6f 77 20 70 61 67 65 20 74 68 61 74 20 77 69 6c  ow page that wil
b4f0: 6c 20 62 65 20 76 61 6c 69 64 20 61 66 74 65 72  l be valid after
b500: 20 70 43 65 6c 6c 20 68 61 73 20 62 65 65 6e 20   pCell has been 
b510: 6d 6f 76 65 64 20 74 6f 20 70 50 61 67 65 2e 0a  moved to pPage..
b520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b530: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
b540: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
b550: 4d 65 6d 50 61 67 65 20 2a 70 53 72 63 2c 20 75  MemPage *pSrc, u
b560: 38 20 2a 70 43 65 6c 6c 2c 69 6e 74 20 2a 70 52  8 *pCell,int *pR
b570: 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  C){.  CellInfo i
b580: 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43 20  nfo;.  if( *pRC 
b590: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
b5a0: 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a  rt( pCell!=0 );.
b5b0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
b5c0: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
b5d0: 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20  , &info);.  if( 
b5e0: 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
b5f0: 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  .nPayload ){.   
b600: 20 50 67 6e 6f 20 6f 76 66 6c 3b 0a 20 20 20 20   Pgno ovfl;.    
b610: 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
b620: 4e 28 70 53 72 63 2d 3e 61 44 61 74 61 45 6e 64  N(pSrc->aDataEnd
b630: 2c 20 70 43 65 6c 6c 2c 20 70 43 65 6c 6c 2b 69  , pCell, pCell+i
b640: 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
b650: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
b660: 53 72 63 21 3d 70 50 61 67 65 20 29 3b 0a 20 20  Src!=pPage );.  
b670: 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
b680: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b690: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
b6a0: 20 20 7d 0a 20 20 20 20 6f 76 66 6c 20 3d 20 67    }.    ovfl = g
b6b0: 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
b6c0: 6e 66 6f 2e 6e 53 69 7a 65 2d 34 5d 29 3b 0a 20  nfo.nSize-4]);. 
b6d0: 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50 61     ptrmapPut(pPa
b6e0: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
b6f0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
b700: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 52   pPage->pgno, pR
b710: 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  C);.  }.}.#endif
b720: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67 6d  .../*.** Defragm
b730: 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69 76  ent the page giv
b740: 65 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  en. This routine
b750: 20 72 65 6f 72 67 61 6e 69 7a 65 73 20 63 65 6c   reorganizes cel
b760: 6c 73 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a  ls within the.**
b770: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74 68   page so that th
b780: 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65 2d  ere are no free-
b790: 62 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 72  blocks on the fr
b7a0: 65 65 2d 62 6c 6f 63 6b 20 6c 69 73 74 2e 0a 2a  ee-block list..*
b7b0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
b7c0: 4d 61 78 46 72 61 67 20 69 73 20 74 68 65 20 6d  MaxFrag is the m
b7d0: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
b7e0: 20 66 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63   fragmented spac
b7f0: 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
b800: 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
b810: 70 61 67 65 20 61 66 74 65 72 20 74 68 69 73 20  page after this 
b820: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2e  routine returns.
b830: 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43 45 2d  .**.** EVIDENCE-
b840: 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30 31 33  OF: R-44582-6013
b850: 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66 72 6f  8 SQLite may fro
b860: 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65 20 72  m time to time r
b870: 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a 20 62  eorganize a.** b
b880: 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20 74 68  -tree page so th
b890: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
b8a0: 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20 66 72  freeblocks or fr
b8b0: 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20 61 6c  agment bytes, al
b8c0: 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79 74 65  l.** unused byte
b8d0: 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20  s are contained 
b8e0: 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63 61 74  in the unallocat
b8f0: 65 64 20 73 70 61 63 65 20 72 65 67 69 6f 6e 2c  ed space region,
b900: 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c   and all.** cell
b910: 73 20 61 72 65 20 70 61 63 6b 65 64 20 74 69 67  s are packed tig
b920: 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e 64 20  htly at the end 
b930: 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
b940: 73 74 61 74 69 63 20 69 6e 74 20 64 65 66 72 61  static int defra
b950: 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50 61 67  gmentPage(MemPag
b960: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 4d  e *pPage, int nM
b970: 61 78 46 72 61 67 29 7b 0a 20 20 69 6e 74 20 69  axFrag){.  int i
b980: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b990: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b9a0: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
b9b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
b9c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
b9d0: 20 6f 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c   of the i-th cel
b9e0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20  l */.  int hdr; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
ba10: 68 65 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  he page header *
ba20: 2f 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  /.  int size;   
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ba40: 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c  * Size of a cell
ba50: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
ba60: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
ba70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73   /* Number of us
ba80: 61 62 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20  able bytes on a 
ba90: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65  page */.  int ce
baa0: 6c 6c 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20  llOffset;       
bab0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
bac0: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
bad0: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  er array */.  in
bae0: 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20  t cbrk;         
baf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
bb00: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63  et to the cell c
bb10: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
bb20: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bb40: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
bb50: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
bb60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
bb70: 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  ata;       /* Th
bb80: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  e page data */. 
bb90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
bba0: 74 65 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54  temp;       /* T
bbb0: 65 6d 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c  emp area for cel
bbc0: 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75  l content */.  u
bbd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72  nsigned char *sr
bbe0: 63 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75  c;        /* Sou
bbf0: 72 63 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a  rce of content *
bc00: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72  /.  int iCellFir
bc10: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  st;            /
bc20: 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c  * First allowabl
bc30: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
bc40: 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b    int iCellLast;
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bc60: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
bc70: 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 61  ll index */..  a
bc80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
bc90: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
bca0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
bcb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
bcc0: 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61  e->pBt!=0 );.  a
bcd0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
bce0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d  t->usableSize <=
bcf0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45   SQLITE_MAX_PAGE
bd00: 5f 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72  _SIZE );.  asser
bd10: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
bd20: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
bd30: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bd40: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
bd50: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74  t->mutex) );.  t
bd60: 65 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d  emp = 0;.  src =
bd70: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
bd80: 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
bd90: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
bda0: 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70    cellOffset = p
bdb0: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
bdc0: 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  ;.  nCell = pPag
bdd0: 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65  e->nCell;.  asse
bde0: 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62  rt( nCell==get2b
bdf0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
be00: 29 20 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73  ) );.  iCellFirs
be10: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b  t = cellOffset +
be20: 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62   2*nCell;.  usab
be30: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
be40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
be50: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63  ..  /* This bloc
be60: 6b 20 68 61 6e 64 6c 65 73 20 70 61 67 65 73 20  k handles pages 
be70: 77 69 74 68 20 74 77 6f 20 6f 72 20 66 65 77 65  with two or fewe
be80: 72 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 61 6e  r free blocks an
be90: 64 20 6e 4d 61 78 46 72 61 67 0a 20 20 2a 2a 20  d nMaxFrag.  ** 
bea0: 6f 72 20 66 65 77 65 72 20 66 72 61 67 6d 65 6e  or fewer fragmen
beb0: 74 65 64 20 62 79 74 65 73 2e 20 49 6e 20 74 68  ted bytes. In th
bec0: 69 73 20 63 61 73 65 20 69 74 20 69 73 20 66 61  is case it is fa
bed0: 73 74 65 72 20 74 6f 20 6d 6f 76 65 20 74 68 65  ster to move the
bee0: 0a 20 20 2a 2a 20 74 77 6f 20 28 6f 72 20 6f 6e  .  ** two (or on
bef0: 65 29 20 62 6c 6f 63 6b 73 20 6f 66 20 63 65 6c  e) blocks of cel
bf00: 6c 73 20 75 73 69 6e 67 20 6d 65 6d 6d 6f 76 65  ls using memmove
bf10: 28 29 20 61 6e 64 20 61 64 64 20 74 68 65 20 72  () and add the r
bf20: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 6f 66 66  equired.  ** off
bf30: 73 65 74 73 20 74 6f 20 65 61 63 68 20 70 6f 69  sets to each poi
bf40: 6e 74 65 72 20 69 6e 20 74 68 65 20 63 65 6c 6c  nter in the cell
bf50: 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 74  -pointer array t
bf60: 68 61 6e 20 69 74 20 69 73 20 74 6f 20 0a 20 20  han it is to .  
bf70: 2a 2a 20 72 65 63 6f 6e 73 74 72 75 63 74 20 74  ** reconstruct t
bf80: 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 2e 20  he entire page. 
bf90: 20 2a 2f 0a 20 20 69 66 28 20 28 69 6e 74 29 64   */.  if( (int)d
bfa0: 61 74 61 5b 68 64 72 2b 37 5d 3c 3d 6e 4d 61 78  ata[hdr+7]<=nMax
bfb0: 46 72 61 67 20 29 7b 0a 20 20 20 20 69 6e 74 20  Frag ){.    int 
bfc0: 69 46 72 65 65 20 3d 20 67 65 74 32 62 79 74 65  iFree = get2byte
bfd0: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a  (&data[hdr+1]);.
bfe0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69  .    /* If the i
bff0: 6e 69 74 69 61 6c 20 66 72 65 65 62 6c 6f 63 6b  nitial freeblock
c000: 20 6f 66 66 73 65 74 20 77 65 72 65 20 6f 75 74   offset were out
c010: 20 6f 66 20 62 6f 75 6e 64 73 2c 20 74 68 61 74   of bounds, that
c020: 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 68 61   would.    ** ha
c030: 76 65 20 62 65 65 6e 20 64 65 74 65 63 74 65 64  ve been detected
c040: 20 62 79 20 62 74 72 65 65 49 6e 69 74 50 61 67   by btreeInitPag
c050: 65 28 29 20 77 68 65 6e 20 69 74 20 77 61 73 20  e() when it was 
c060: 63 6f 6d 70 75 74 69 6e 67 20 74 68 65 0a 20 20  computing the.  
c070: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 66    ** number of f
c080: 72 65 65 20 62 79 74 65 73 20 6f 6e 20 74 68 65  ree bytes on the
c090: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
c0a0: 73 65 72 74 28 20 69 46 72 65 65 3c 3d 75 73 61  sert( iFree<=usa
c0b0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
c0c0: 20 69 66 28 20 69 46 72 65 65 20 29 7b 0a 20 20   if( iFree ){.  
c0d0: 20 20 20 20 69 6e 74 20 69 46 72 65 65 32 20 3d      int iFree2 =
c0e0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
c0f0: 69 46 72 65 65 5d 29 3b 0a 20 20 20 20 20 20 69  iFree]);.      i
c100: 66 28 20 69 46 72 65 65 32 3e 75 73 61 62 6c 65  f( iFree2>usable
c110: 53 69 7a 65 2d 34 20 29 20 72 65 74 75 72 6e 20  Size-4 ) return 
c120: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c130: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c140: 20 20 69 66 28 20 30 3d 3d 69 46 72 65 65 32 20    if( 0==iFree2 
c150: 7c 7c 20 28 64 61 74 61 5b 69 46 72 65 65 32 5d  || (data[iFree2]
c160: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 46 72 65  ==0 && data[iFre
c170: 65 32 2b 31 5d 3d 3d 30 29 20 29 7b 0a 20 20 20  e2+1]==0) ){.   
c180: 20 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20       u8 *pEnd = 
c190: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c1a0: 20 2b 20 6e 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20   + nCell*2];.   
c1b0: 20 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 0a       u8 *pAddr;.
c1c0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 32 20          int sz2 
c1d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
c1e0: 20 73 7a 20 3d 20 67 65 74 32 62 79 74 65 28 26   sz = get2byte(&
c1f0: 64 61 74 61 5b 69 46 72 65 65 2b 32 5d 29 3b 0a  data[iFree+2]);.
c200: 20 20 20 20 20 20 20 20 69 6e 74 20 74 6f 70 20          int top 
c210: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
c220: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
c230: 20 20 69 66 28 20 74 6f 70 3e 3d 69 46 72 65 65    if( top>=iFree
c240: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
c250: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
c260: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
c270: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c280: 20 20 20 69 66 28 20 69 46 72 65 65 32 20 29 7b     if( iFree2 ){
c290: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
c2a0: 46 72 65 65 2b 73 7a 3e 69 46 72 65 65 32 20 29  Free+sz>iFree2 )
c2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c2c0: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c2d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  e);.          sz
c2e0: 32 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  2 = get2byte(&da
c2f0: 74 61 5b 69 46 72 65 65 32 2b 32 5d 29 3b 0a 20  ta[iFree2+2]);. 
c300: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72           if( iFr
c310: 65 65 32 2b 73 7a 32 20 3e 20 75 73 61 62 6c 65  ee2+sz2 > usable
c320: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
c330: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c340: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c350: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64 61 74      memmove(&dat
c360: 61 5b 69 46 72 65 65 2b 73 7a 2b 73 7a 32 5d 2c  a[iFree+sz+sz2],
c370: 20 26 64 61 74 61 5b 69 46 72 65 65 2b 73 7a 5d   &data[iFree+sz]
c380: 2c 20 69 46 72 65 65 32 2d 28 69 46 72 65 65 2b  , iFree2-(iFree+
c390: 73 7a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  sz));.          
c3a0: 73 7a 20 2b 3d 20 73 7a 32 3b 0a 20 20 20 20 20  sz += sz2;.     
c3b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 62 72     }.        cbr
c3c0: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c3d0: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c3e0: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c3f0: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c400: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c410: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c420: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c430: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c440: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c450: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c460: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c470: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c480: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c490: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4a0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4b0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c4c0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c4d0: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c4e0: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c4f0: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c510: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c520: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c530: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c540: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c550: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c560: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c570: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c580: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c590: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5a0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5b0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c5c0: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c5d0: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c5e0: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c5f0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c600: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c610: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c620: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c630: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c640: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c650: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c660: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c670: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c680: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c690: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6b0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c6c0: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c6d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c6e0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c6f0: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c700: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c710: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c720: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c730: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c740: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c750: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c760: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c770: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c780: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c790: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7b0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c7c0: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c7d0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c7e0: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c7f0: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c800: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c810: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c820: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c830: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c840: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c850: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c860: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c870: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c880: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c890: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8a0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8b0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c8c0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c8d0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c8e0: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c8f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c900: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c910: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c920: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c930: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c940: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c950: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c960: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c970: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c980: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c990: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9a0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
c9b0: 37 5d 2b 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72  7]+cbrk-iCellFir
c9c0: 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65  st!=pPage->nFree
c9d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
c9e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
c9f0: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
ca00: 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 69   assert( cbrk>=i
ca10: 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 70  CellFirst );.  p
ca20: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
ca30: 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64  r+5], cbrk);.  d
ca40: 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a  ata[hdr+1] = 0;.
ca50: 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20    data[hdr+2] = 
ca60: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
ca70: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
ca80: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
ca90: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
caa0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
cab0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
cac0: 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75 72  Page) );.  retur
cad0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cae0: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
caf0: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
cb00: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
cb10: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
cb20: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
cb30: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
cb40: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
cb50: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
cb60: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
cb70: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
cb80: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
cb90: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
cba0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
cbb0: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
cbc0: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
cbd0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
cbe0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
cbf0: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
cc00: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
cc10: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
cc20: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
cc30: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
cc40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
cc50: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
cc60: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
cc70: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
cc80: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
cc90: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
cca0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
ccb0: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
ccc0: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
ccd0: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
cce0: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
ccf0: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
cd00: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
cd10: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
cd20: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
cd30: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
cd40: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
cd50: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
cd60: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
cd70: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
cd80: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
cd90: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
cda0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
cdb0: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
cdc0: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
cdd0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
cde0: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
cdf0: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
ce00: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
ce10: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 6e 74 20  ableSize;.  int 
ce20: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
ce30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
ce40: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 0a 20 20  free slot */..  
ce50: 61 73 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a  assert( pc>0 );.
ce60: 20 20 77 68 69 6c 65 28 20 70 63 3c 3d 75 73 61    while( pc<=usa
ce70: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
ce80: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
ce90: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
cea0: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
ceb0: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
cec0: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
ced0: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
cee0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
cef0: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
cf00: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
cf10: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
cf20: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
cf30: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
cf40: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
cf50: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
cf60: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
cf70: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
cf80: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
cf90: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
cfa0: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
cfb0: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  3 );.      if( s
cfc0: 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65 53  ize+pc > usableS
cfd0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ize ){.        *
cfe0: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
cff0: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d000: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
d010: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
d020: 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20 20 20  ( x<4 ){.       
d030: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d040: 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32 20 49   R-11498-58022 I
d050: 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20  n a well-formed 
d060: 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68 65  b-tree page, the
d070: 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20 20 2a   total.        *
d080: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * number of byte
d090: 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d  s in fragments m
d0a0: 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20 36 30  ay not exceed 60
d0b0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  . */.        if(
d0c0: 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37   aData[hdr+7]>57
d0d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
d0e0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
d0f0: 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68  the slot from th
d100: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55 70 64  e free-list. Upd
d110: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
d120: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 72 61  f.        ** fra
d130: 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20 77 69  gmented bytes wi
d140: 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  thin the page. *
d150: 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  /.        memcpy
d160: 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d 2c 20  (&aData[iAddr], 
d170: 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a  &aData[pc], 2);.
d180: 20 20 20 20 20 20 20 20 61 44 61 74 61 5b 68 64          aData[hd
d190: 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20  r+7] += (u8)x;. 
d1a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
d1b0: 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f 74 20      /* The slot 
d1c0: 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65 20 66  remains on the f
d1d0: 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75 63 65  ree-list. Reduce
d1e0: 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61 63 63   its size to acc
d1f0: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 2a 2a  ount.         **
d200: 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69 6f 6e   for the portion
d210: 20 75 73 65 64 20 62 79 20 74 68 65 20 6e 65 77   used by the new
d220: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a   allocation. */.
d230: 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74 65          put2byte
d240: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c 20 78  (&aData[pc+2], x
d250: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d260: 20 72 65 74 75 72 6e 20 26 61 44 61 74 61 5b 70   return &aData[p
d270: 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a 20 20  c + x];.    }.  
d280: 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a 20 20    iAddr = pc;.  
d290: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
d2a0: 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  &aData[pc]);.   
d2b0: 20 69 66 28 20 70 63 3c 69 41 64 64 72 2b 73 69   if( pc<iAddr+si
d2c0: 7a 65 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ze ) break;.  }.
d2d0: 20 20 69 66 28 20 70 63 20 29 7b 0a 20 20 20 20    if( pc ){.    
d2e0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
d2f0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b  RRUPT_PAGE(pPg);
d300: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
d310: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d320: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d330: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d340: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d350: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d360: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d370: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d380: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d390: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d3a0: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d3b0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d3c0: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d3d0: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d3e0: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d3f0: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d400: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d410: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d420: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d430: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d440: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d450: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d460: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d470: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d480: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d490: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d4a0: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d4b0: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d4c0: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d4d0: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d4e0: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d4f0: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d500: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d510: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d520: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d530: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d540: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d550: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d560: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d570: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d580: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d590: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d5a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d5b0: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d5c0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d5d0: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d5e0: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d5f0: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d600: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d610: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d620: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d630: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d640: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d650: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d660: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d670: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d680: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d6a0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d6b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d6c0: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d6d0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d6f0: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d700: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d710: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d720: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d730: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d740: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d750: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
d760: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d770: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
d780: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
d790: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d7a0: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
d7b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d7c0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d7d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d7e0: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
d7f0: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
d800: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
d810: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
d820: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
d830: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d840: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
d850: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
d860: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
d870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
d880: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
d890: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
d8a0: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
d8b0: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
d8c0: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
d8d0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
d8e0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
d8f0: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
d900: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
d910: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
d920: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
d930: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
d940: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
d950: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
d960: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
d970: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
d980: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
d990: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
d9a0: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
d9b0: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
d9c0: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
d9d0: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
d9e0: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
d9f0: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
da00: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
da10: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
da20: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
da30: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
da40: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
da50: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
da60: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
da70: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
da80: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
da90: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
daa0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
dab0: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
dac0: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
dad0: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
dae0: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
daf0: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
db00: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
db10: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
db20: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
db30: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
db40: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
db50: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
db60: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
db70: 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73  here is enough s
db80: 70 61 63 65 20 62 65 74 77 65 65 6e 20 67 61 70  pace between gap
db90: 20 61 6e 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65   and top for one
dba0: 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74   more cell point
dbb0: 65 72 0a 20 20 2a 2a 20 61 72 72 61 79 20 65 6e  er.  ** array en
dbc0: 74 72 79 20 6f 66 66 73 65 74 2c 20 61 6e 64 20  try offset, and 
dbd0: 69 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  if the freelist 
dbe0: 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68  is not empty, th
dbf0: 65 6e 20 73 65 61 72 63 68 20 74 68 65 0a 20 20  en search the.  
dc00: 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b  ** freelist look
dc10: 69 6e 67 20 66 6f 72 20 61 20 66 72 65 65 20 73  ing for a free s
dc20: 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74  lot big enough t
dc30: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65  o satisfy the re
dc40: 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65  quest..  */.  te
dc50: 73 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74  stcase( gap+2==t
dc60: 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  op );.  testcase
dc70: 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a  ( gap+1==top );.
dc80: 20 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d    testcase( gap=
dc90: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64  =top );.  if( (d
dca0: 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61  ata[hdr+2] || da
dcb0: 74 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61  ta[hdr+1]) && ga
dcc0: 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20  p+2<=top ){.    
dcd0: 75 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67  u8 *pSpace = pag
dce0: 65 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c  eFindSlot(pPage,
dcf0: 20 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20   nByte, &rc);.  
dd00: 20 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a    if( pSpace ){.
dd10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53        assert( pS
dd20: 70 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70  pace>=data && (p
dd30: 53 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35  Space - data)<65
dd40: 35 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49  536 );.      *pI
dd50: 64 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63  dx = (int)(pSpac
dd60: 65 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20  e - data);.     
dd70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
dd80: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  K;.    }else if(
dd90: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
dda0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
ddb0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75  }..  /* The requ
ddc0: 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  est could not be
ddd0: 20 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67   fulfilled using
dde0: 20 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74   a freelist slot
ddf0: 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f  .  Check.  ** to
de00: 20 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65   see if defragme
de10: 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73  ntation is neces
de20: 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  sary..  */.  tes
de30: 74 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79  tcase( gap+2+nBy
de40: 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  te==top );.  if(
de50: 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70   gap+2+nByte>top
de60: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
de70: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c  pPage->nCell>0 |
de80: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
de90: 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d      rc = defragm
dea0: 65 6e 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d  entPage(pPage, M
deb0: 49 4e 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72  IN(4, pPage->nFr
dec0: 65 65 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29  ee - (2+nByte)))
ded0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
dee0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f  eturn rc;.    to
def0: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
df00: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
df10: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  );.    assert( g
df20: 61 70 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20  ap+2+nByte<=top 
df30: 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c  );.  }...  /* Al
df40: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72  locate memory fr
df50: 6f 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65  om the gap in be
df60: 74 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70  tween the cell p
df70: 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a  ointer array.  *
df80: 2a 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  * and the cell c
df90: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68  ontent area.  Th
dfa0: 65 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  e btreeInitPage(
dfb0: 29 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61  ) call has alrea
dfc0: 64 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65  dy.  ** validate
dfd0: 64 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  d the freelist. 
dfe0: 20 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20   Given that the 
dff0: 66 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69  freelist is vali
e000: 64 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73  d, there.  ** is
e010: 20 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65   no way that the
e020: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20   allocation can 
e030: 65 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65  extend off the e
e040: 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nd of the page..
e050: 20 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28    ** The assert(
e060: 29 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73  ) below verifies
e070: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65   the previous se
e080: 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74  ntence..  */.  t
e090: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70  op -= nByte;.  p
e0a0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
e0b0: 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73  r+5], top);.  as
e0c0: 73 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20  sert( top+nByte 
e0d0: 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
e0e0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
e0f0: 3b 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b  ;.  *pIdx = top;
e100: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e110: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
e120: 74 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f  turn a section o
e130: 66 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  f the pPage->aDa
e140: 74 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ta to the freeli
e150: 73 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  st..** The first
e160: 20 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77   byte of the new
e170: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70   free block is p
e180: 50 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61  Page->aData[iSta
e190: 72 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73  rt].** and the s
e1a0: 69 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  ize of the block
e1b0: 20 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e   is iSize bytes.
e1c0: 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20  .**.** Adjacent 
e1d0: 66 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63  freeblocks are c
e1e0: 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  oalesced..**.** 
e1f0: 4e 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74  Note that even t
e200: 68 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c  hough the freebl
e210: 6f 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65  ock list was che
e220: 63 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69  cked by btreeIni
e230: 74 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74  tPage(),.** that
e240: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f   routine will no
e250: 74 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70  t detect overlap
e260: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f   between cells o
e270: 72 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e  r freeblocks.  N
e280: 6f 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65  or.** does it de
e290: 74 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72  tect cells or fr
e2a0: 65 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e  eeblocks that en
e2b0: 63 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20  crouch into the 
e2c0: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a  reserved bytes.*
e2d0: 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
e2e0: 74 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f  the page.  So do
e2f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72   additional corr
e300: 75 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e  uption checks in
e310: 73 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75  side this.** rou
e320: 74 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20  tine and return 
e330: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
e340: 66 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61  f any problems a
e350: 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  re found..*/.sta
e360: 74 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63  tic int freeSpac
e370: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
e380: 2c 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31  , u16 iStart, u1
e390: 36 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20  6 iSize){.  u16 
e3a0: 69 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20  iPtr;           
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
e3d0: 70 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65  ptr to next free
e3e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69  block */.  u16 i
e3f0: 46 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20  FreeBlk;        
e400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e410: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
e420: 68 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63  he next freebloc
e430: 6b 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20  k */.  u8 hdr;  
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e460: 50 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65  Page header size
e470: 2e 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20  .  0 or 100 */. 
e480: 20 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20   u8 nFrag = 0;  
e490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4a0: 20 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74         /* Reduct
e4b0: 69 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61  ion in fragmenta
e4c0: 74 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f  tion */.  u16 iO
e4d0: 72 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b  rigSize = iSize;
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75  /* Original valu
e500: 65 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20  e of iSize */.  
e510: 75 31 36 20 78 3b 20 20 20 20 20 20 20 20 20 20  u16 x;          
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e530: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
e540: 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  to cell content 
e550: 61 72 65 61 20 2a 2f 0a 20 20 75 33 32 20 69 45  area */.  u32 iE
e560: 6e 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53  nd = iStart + iS
e570: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
e580: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
e590: 73 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75  st the iStart bu
e5a0: 66 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ffer */.  unsign
e5b0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20  ed char *data = 
e5c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20  pPage->aData;   
e5d0: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20  /* Page content 
e5e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e5f0: 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20  age->pBt!=0 );. 
e600: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e610: 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
e620: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   );.  assert( CO
e640: 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61  RRUPT_DB || iSta
e650: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
e660: 66 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68  fset+6+pPage->ch
e670: 69 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20  ildPtrSize );.  
e680: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
e690: 44 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50  DB || iEnd <= pP
e6a0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e6b0: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
e6c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e6d0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
e6e0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
e6f0: 65 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b  ert( iSize>=4 );
e700: 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65     /* Minimum ce
e710: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
e720: 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
e730: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
e740: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 0a 20  ableSize-4 );.. 
e750: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f 66 20   /* The list of 
e760: 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20  freeblocks must 
e770: 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  be in ascending 
e780: 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74 68 65  order.  Find the
e790: 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74   .  ** spot on t
e7a0: 68 65 20 6c 69 73 74 20 77 68 65 72 65 20 69 53  he list where iS
e7b0: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 20 69  tart should be i
e7c0: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
e7d0: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
e7e0: 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72 20 3d  Offset;.  iPtr =
e7f0: 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66 28 20   hdr + 1;.  if( 
e800: 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20  data[iPtr+1]==0 
e810: 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30  && data[iPtr]==0
e820: 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42 6c 6b   ){.    iFreeBlk
e830: 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63   = 0;  /* Shortc
e840: 75 74 20 66 6f 72 20 74 68 65 20 63 61 73 65 20  ut for the case 
e850: 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c 69 73  when the freelis
e860: 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20  t is empty */.  
e870: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
e880: 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20 67 65  ( (iFreeBlk = ge
e890: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
e8a0: 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b 0a 20  r]))<iStart ){. 
e8b0: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
e8c0: 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20 20 20  k<iPtr+4 ){.    
e8d0: 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b      if( iFreeBlk
e8e0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e8f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e900: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
e910: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
e920: 20 20 20 20 20 20 69 50 74 72 20 3d 20 69 46 72        iPtr = iFr
e930: 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  eeBlk;.    }.   
e940: 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e 70 50   if( iFreeBlk>pP
e950: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e960: 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20 20 20 20  Size-4 ){.      
e970: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
e980: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
e990: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
e9a0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
e9b0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
e9c0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
e9d0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
e9e0: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
e9f0: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
ea00: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
ea10: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
ea20: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
ea30: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
ea40: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
ea50: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
ea60: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
ea70: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
ea80: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
ea90: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
eaa0: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
eab0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
eac0: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
ead0: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
eae0: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
eaf0: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
eb00: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
eb10: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
eb20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
eb30: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
eb40: 20 69 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b   iEnd = iFreeBlk
eb50: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
eb60: 61 5b 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a  a[iFreeBlk+2]);.
eb70: 20 20 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e        if( iEnd >
eb80: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
eb90: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
eba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ebb0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ebc0: 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
ebd0: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
ebe0: 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20 20   - iStart;.     
ebf0: 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32   iFreeBlk = get2
ec00: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
ec10: 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Blk]);.    }.  .
ec20: 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20 69      /* If iPtr i
ec30: 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62 6c  s another freebl
ec40: 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69 66  ock (that is, if
ec50: 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68 65   iPtr is not the
ec60: 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a 2a   freelist.    **
ec70: 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
ec80: 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68 65  page header) the
ec90: 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  n check to see i
eca0: 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  f iStart should 
ecb0: 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65 73  be.    ** coales
ecc0: 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ced onto the end
ecd0: 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a 2f   of iPtr..    */
ece0: 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68 64  .    if( iPtr>hd
ecf0: 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  r+1 ){.      int
ed00: 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72 20   iPtrEnd = iPtr 
ed10: 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  + get2byte(&data
ed20: 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20 20  [iPtr+2]);.     
ed30: 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e 3d   if( iPtrEnd+3>=
ed40: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
ed50: 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69 53    if( iPtrEnd>iS
ed60: 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53 51  tart ) return SQ
ed70: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
ed80: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
ed90: 20 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72    nFrag += iStar
eda0: 74 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20  t - iPtrEnd;.   
edb0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
edc0: 64 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20  d - iPtr;.      
edd0: 20 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b    iStart = iPtr;
ede0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
edf0: 20 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74     if( nFrag>dat
ee00: 61 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72  a[hdr+7] ) retur
ee10: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
ee20: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ee30: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d    data[hdr+7] -=
ee40: 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20 20 78 20   nFrag;.  }.  x 
ee50: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
ee60: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 69 66 28 20  [hdr+5]);.  if( 
ee70: 69 53 74 61 72 74 3c 3d 78 20 29 7b 0a 20 20 20  iStart<=x ){.   
ee80: 20 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65   /* The new free
ee90: 62 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20  block is at the 
eea0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
eeb0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
eec0: 65 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75  ea,.    ** so ju
eed0: 73 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65  st extend the ce
eee0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eef0: 72 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61  rather than crea
ef00: 74 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  te another.    *
ef10: 2a 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79  * freelist entry
ef20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 53 74 61   */.    if( iSta
ef30: 72 74 3c 78 20 7c 7c 20 69 50 74 72 21 3d 68 64  rt<x || iPtr!=hd
ef40: 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+1 ) return SQL
ef50: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
ef60: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70 75 74  (pPage);.    put
ef70: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ef80: 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  1], iFreeBlk);. 
ef90: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
efa0: 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64 29 3b  a[hdr+5], iEnd);
efb0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
efc0: 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
efd0: 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f 20 74  freeblock into t
efe0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
eff0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
f000: 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72 74 29  a[iPtr], iStart)
f010: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
f020: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
f030: 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
f040: 52 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65  RE ){.    /* Ove
f050: 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69  rwrite deleted i
f060: 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20  nformation with 
f070: 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73  zeros when the s
f080: 65 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 20  ecure_delete.   
f090: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
f0a0: 61 62 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  abled */.    mem
f0b0: 73 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74  set(&data[iStart
f0c0: 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20  ], 0, iSize);.  
f0d0: 7d 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  }.  put2byte(&da
f0e0: 74 61 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65  ta[iStart], iFre
f0f0: 65 42 6c 6b 29 3b 0a 20 20 70 75 74 32 62 79 74  eBlk);.  put2byt
f100: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
f110: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 70 50 61  ], iSize);.  pPa
f120: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
f130: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
f140: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
f150: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
f160: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
f170: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
f180: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
f190: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
f1a0: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
f1b0: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
f1c0: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
f1d0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
f1e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
f1f0: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
f200: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
f210: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
f220: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
f230: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
f240: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
f250: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
f260: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f270: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
f280: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
f290: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
f2a0: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
f2b0: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
f2c0: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
f2d0: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
f2e0: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
f2f0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
f300: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
f310: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
f320: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
f330: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
f340: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
f350: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
f360: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
f370: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
f380: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f390: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f3a0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f3b0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
f3c0: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
f3d0: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
f3e0: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
f3f0: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
f400: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
f410: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
f420: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
f430: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
f440: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
f450: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
f460: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
f470: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
f480: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
f490: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) ){.    /* EVID
f4a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37 32 39 31  ENCE-OF: R-07291
f4b0: 2d 33 35 33 32 38 20 41 20 76 61 6c 75 65 20 6f  -35328 A value o
f4c0: 66 20 35 20 28 30 78 30 35 29 20 6d 65 61 6e 73  f 5 (0x05) means
f4d0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e 0a   the page is an.
f4e0: 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20      ** interior 
f4f0: 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67  table b-tree pag
f500: 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  e. */.    assert
f510: 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c  ( (PTF_LEAFDATA|
f520: 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29  PTF_INTKEY)==5 )
f530: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f540: 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30 2d 30 39  E-OF: R-26900-09
f550: 31 37 36 20 41 20 76 61 6c 75 65 20 6f 66 20 31  176 A value of 1
f560: 33 20 28 30 78 30 64 29 20 6d 65 61 6e 73 20 74  3 (0x0d) means t
f570: 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20 20  he page is a.   
f580: 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c 65 20 62   ** leaf table b
f590: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f5a0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f5b0: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
f5c0: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31  KEY|PTF_LEAF)==1
f5d0: 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  3 );.    pPage->
f5e0: 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20  intKey = 1;.    
f5f0: 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
f600: 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  ){.      pPage->
f610: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b 0a  intKeyLeaf = 1;.
f620: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
f630: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f640: 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20  arseCellPtr;.   
f650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
f660: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
f670: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
f680: 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65  ->xCellSize = ce
f690: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
f6a0: 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  ad;.      pPage-
f6b0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f6c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
f6d0: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 7d 0a  oPayload;.    }.
f6e0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f      pPage->maxLo
f6f0: 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65  cal = pBt->maxLe
f700: 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  af;.    pPage->m
f710: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
f720: 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20  inLeaf;.  }else 
f730: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 50 54  if( flagByte==PT
f740: 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a 20 20  F_ZERODATA ){.  
f750: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
f760: 3a 20 52 2d 34 33 33 31 36 2d 33 37 33 30 38 20  : R-43316-37308 
f770: 41 20 76 61 6c 75 65 20 6f 66 20 32 20 28 30 78  A value of 2 (0x
f780: 30 32 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61  02) means the pa
f790: 67 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  ge is an.    ** 
f7a0: 69 6e 74 65 72 69 6f 72 20 69 6e 64 65 78 20 62  interior index b
f7b0: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
f7c0: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
f7d0: 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a  ZERODATA)==2 );.
f7e0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
f7f0: 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34 32 38 32  OF: R-59615-4282
f800: 38 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20  8 A value of 10 
f810: 28 30 78 30 61 29 20 6d 65 61 6e 73 20 74 68 65  (0x0a) means the
f820: 20 70 61 67 65 20 69 73 20 61 0a 20 20 20 20 2a   page is a.    *
f830: 2a 20 6c 65 61 66 20 69 6e 64 65 78 20 62 2d 74  * leaf index b-t
f840: 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  ree page. */.   
f850: 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45   assert( (PTF_ZE
f860: 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45 41 46 29  RODATA|PTF_LEAF)
f870: 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70 50 61 67  ==10 );.    pPag
f880: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30 3b 0a 20  e->intKey = 0;. 
f890: 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79     pPage->intKey
f8a0: 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 50  Leaf = 0;.    pP
f8b0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f8c0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f8d0: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
f8e0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
f8f0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
f900: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
f910: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
f920: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
f930: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f940: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
f950: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
f960: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
f970: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
f980: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
f990: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f9a0: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
f9b0: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  age);.  }.  pPag
f9c0: 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  e->max1bytePaylo
f9d0: 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79  ad = pBt->max1by
f9e0: 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74  tePayload;.  ret
f9f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
fa00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
fa10: 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  ze the auxiliary
fa20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
fa30: 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a   a disk block..*
fa40: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
fa50: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
fa60: 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61  .  If we see tha
fa70: 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a  t the page does.
fa80: 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  ** not contain a
fa90: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
faa0: 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e  abase page, then
fab0: 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49   return .** SQLI
fac0: 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74  TE_CORRUPT.  Not
fad0: 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20  e that a return 
fae0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65  of SQLITE_OK doe
faf0: 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74  s not.** guarant
fb00: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
fb10: 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e   is well-formed.
fb20: 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20    It only shows 
fb30: 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65  that.** we faile
fb40: 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20  d to detect any 
fb50: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
fb60: 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
fb70: 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20  nitPage(MemPage 
fb80: 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 70  *pPage){.  int p
fb90: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
fba0: 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72   Address of a fr
fbb0: 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70  eeblock within p
fbc0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f  Page->aData[] */
fbd0: 0a 20 20 75 38 20 68 64 72 3b 20 20 20 20 20 20  .  u8 hdr;      
fbe0: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
fbf0: 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  to beginning of 
fc00: 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
fc10: 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
fc20: 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20      /* Equal to 
fc30: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
fc40: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
fc50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
fc60: 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63 74  ain btree struct
fc70: 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61  ure */.  int usa
fc80: 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41  bleSize;    /* A
fc90: 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20  mount of usable 
fca0: 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
fcb0: 67 65 20 2a 2f 0a 20 20 75 31 36 20 63 65 6c 6c  ge */.  u16 cell
fcc0: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
fcd0: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
fce0: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
fcf0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
fd00: 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20  .  int nFree;   
fd10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
fd20: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
fd30: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
fd40: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
fd50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
fd60: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
fd70: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
fd80: 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
fd90: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
fda0: 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
fdb0: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
fdc0: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
fdd0: 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
fde0: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
fdf0: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
fe00: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
fe10: 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a  Page->pBt!=0 );.
fe20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
fe30: 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  >pBt->db!=0 );. 
fe40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
fe50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
fe60: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
fe70: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
fe80: 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  e->pgno==sqlite3
fe90: 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
fea0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
feb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
fec0: 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ge == sqlite3Pag
fed0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
fee0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
fef0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61  assert( pPage->a
ff00: 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50  Data == sqlite3P
ff10: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
ff20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
ff30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
ff40: 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 0a 20 20  isInit==0 );..  
ff50: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
ff60: 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
ff70: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 64 61  >hdrOffset;.  da
ff80: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
ff90: 61 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  a;.  /* EVIDENCE
ffa0: 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32 38  -OF: R-28594-028
ffb0: 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65 20  90 The one-byte 
ffc0: 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20 30  flag at offset 0
ffd0: 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a   indicating.  **
ffe0: 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
fff0: 20 74 79 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20   type. */.  if( 
10000 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67  decodeFlags(pPag
10010 65 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 7b  e, data[hdr]) ){
10020 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10030 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10040 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
10050 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
10060 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
10070 3e 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36  >pageSize<=65536
10080 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
10090 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70 42  kPage = (u16)(pB
100a0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29  t->pageSize - 1)
100b0 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
100c0 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 75 73 61 62  flow = 0;.  usab
100d0 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
100e0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67  ableSize;.  pPag
100f0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
10100 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72  cellOffset = hdr
10110 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68   + 8 + pPage->ch
10120 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 70 50  ildPtrSize;.  pP
10130 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10140 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a 65  &data[usableSize
10150 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43 65 6c  ];.  pPage->aCel
10160 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 63 65 6c  lIdx = &data[cel
10170 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 70 50 61 67  lOffset];.  pPag
10180 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
10190 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
101a0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 2f 2a 20  dPtrSize];.  /* 
101b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
101c0 38 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74  8015-48175 The t
101d0 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20  wo-byte integer 
101e0 61 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69  at offset 5 desi
101f0 67 6e 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20  gnates.  ** the 
10200 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10210 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l content area. 
10220 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72  A zero value for
10230 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69 73   this integer is
10240 0a 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65  .  ** interprete
10250 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
10260 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
10270 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
10280 2b 35 5d 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45  +5]);.  /* EVIDE
10290 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d  NCE-OF: R-37002-
102a0 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79  32774 The two-by
102b0 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
102c0 66 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65  fset 3 gives the
102d0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
102e0 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61 67  cells on the pag
102f0 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d 3e 6e  e. */.  pPage->n
10300 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
10310 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
10320 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
10330 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
10340 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
10350 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
10360 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
10370 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
10380 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
10390 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
103a0 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
103b0 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 50  }.  testcase( pP
103c0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43  age->nCell==MX_C
103d0 45 4c 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a  ELL(pBt) );.  /*
103e0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
103f0 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
10400 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
10410 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
10420 73 20 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73  s only.  ** poss
10430 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20  ible for a root 
10440 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
10450 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  that contains no
10460 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a   rows) then the.
10470 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
10480 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
10490 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
104a0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
104b0 6e 75 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74  nus the.  ** byt
104c0 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20 73  es of reserved s
104d0 70 61 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  pace. */.  asser
104e0 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
104f0 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
10500 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
10510 44 42 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 6d 61  DB );..  /* A ma
10520 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  lformed database
10530 20 70 61 67 65 20 6d 69 67 68 74 20 63 61 75 73   page might caus
10540 65 20 75 73 20 74 6f 20 72 65 61 64 20 70 61 73  e us to read pas
10550 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 6f  t the end.  ** o
10560 66 20 70 61 67 65 20 77 68 65 6e 20 70 61 72 73  f page when pars
10570 69 6e 67 20 61 20 63 65 6c 6c 2e 20 20 0a 20 20  ing a cell.  .  
10580 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  **.  ** The foll
10590 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
105a0 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
105b0 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
105c0 6c 20 65 78 74 65 6e 64 73 0a 20 20 2a 2a 20 70  l extends.  ** p
105d0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ast the end of a
105e0 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61   page boundary a
105f0 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45  nd causes SQLITE
10600 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a  _CORRUPT to be .
10610 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
10620 20 69 74 20 64 6f 65 73 2e 0a 20 20 2a 2f 0a 20   it does..  */. 
10630 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
10640 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
10650 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  ge->nCell;.  iCe
10660 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
10670 69 7a 65 20 2d 20 34 3b 0a 20 20 69 66 28 20 70  ize - 4;.  if( p
10680 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  Bt->db->flags & 
10690 53 51 4c 49 54 45 5f 43 65 6c 6c 53 69 7a 65 43  SQLITE_CellSizeC
106a0 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20  k ){.    int i; 
106b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
106c0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c  dex into the cel
106d0 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
106e0 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  */.    int sz;  
106f0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
10700 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
10710 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
10720 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d  eaf ) iCellLast-
10730 2d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  -;.    for(i=0; 
10740 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
10750 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 63 20 3d  i++){.      pc =
10760 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64   get2byteAligned
10770 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65  (&data[cellOffse
10780 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 74  t+i*2]);.      t
10790 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
107a0 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
107b0 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69   testcase( pc==i
107c0 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
107d0 20 20 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69    if( pc<iCellFi
107e0 72 73 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c  rst || pc>iCellL
107f0 61 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ast ){.        r
10800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10810 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
10820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10830 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c  sz = pPage->xCel
10840 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 64 61  lSize(pPage, &da
10850 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20 74  ta[pc]);.      t
10860 65 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d  estcase( pc+sz==
10870 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
10880 20 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73      if( pc+sz>us
10890 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
108a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
108b0 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
108c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
108d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50     }.    if( !pP
108e0 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
108f0 6c 4c 61 73 74 2b 2b 3b 0a 20 20 7d 20 20 0a 0a  lLast++;.  }  ..
10900 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10910 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
10920 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  e on the page.  
10930 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
10940 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54 68  R-23588-34450 Th
10950 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
10960 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20 67  er at offset 1 g
10970 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 73 74  ives the.  ** st
10980 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
10990 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
109a0 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
109b0 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
109c0 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63  no.  ** freebloc
109d0 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65  ks. */.  pc = ge
109e0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
109f0 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20  +1]);.  nFree = 
10a00 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f  data[hdr+7] + to
10a10 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65  p;  /* Init nFre
10a20 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f  e to non-freeblo
10a30 63 6b 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f  ck free space */
10a40 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b 0a 20  .  if( pc>0 ){. 
10a50 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73 69 7a     u32 next, siz
10a60 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43  e;.    if( pc<iC
10a70 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ellFirst ){.    
10a80 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10a90 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30 20  : R-55530-52930 
10aa0 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  In a well-formed
10ab0 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74 68   b-tree page, th
10ac0 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ere will.      *
10ad0 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c  * always be at l
10ae0 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20 62 65  east one cell be
10af0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 66  fore the first f
10b00 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20 20 20  reeblock..      
10b10 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10b20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10b30 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20 20 20  AGE(pPage); .   
10b40 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20   }.    while( 1 
10b50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e  ){.      if( pc>
10b60 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
10b70 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63       /* Freebloc
10b80 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  k off the end of
10b90 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
10ba0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10bb0 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10bc0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pPage);.      }.
10bd0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
10be0 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
10bf0 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
10c00 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10c10 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46 72 65  +2]);.      nFre
10c20 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65  e = nFree + size
10c30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78 74  ;.      if( next
10c40 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20 62 72  <=pc+size+3 ) br
10c50 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20 3d 20  eak;.      pc = 
10c60 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  next;.    }.    
10c70 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a 20 20  if( next>0 ){.  
10c80 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f 63 6b      /* Freeblock
10c90 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64 69 6e   not in ascendin
10ca0 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
10cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10cc0 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10cd0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
10ce0 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73 69 67  ( pc+size>(unsig
10cf0 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65 53 69  ned int)usableSi
10d00 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c  ze ){.      /* L
10d10 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 65 78  ast freeblock ex
10d20 74 65 6e 64 73 20 70 61 73 74 20 70 61 67 65 20  tends past page 
10d30 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  end */.      ret
10d40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10d50 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10d60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10d70 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e  At this point, n
10d80 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Free contains th
10d90 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66  e sum of the off
10da0 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
10db0 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c  .  ** of the cel
10dc0 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
10dd0 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
10de0 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
10df0 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63 65 6c  hin.  ** the cel
10e00 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20  l-content area. 
10e10 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61 74  If this is great
10e20 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61 62  er than the usab
10e30 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f 66 20  le-size.  ** of 
10e40 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
10e50 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
10e60 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
10e70 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a 2a 20  check also.  ** 
10e80 73 65 72 76 65 73 20 74 6f 20 76 65 72 69 66 79  serves to verify
10e90 20 74 68 61 74 20 74 68 65 20 6f 66 66 73 65 74   that the offset
10ea0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
10eb0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10ec0 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61 63 63  t.  ** area, acc
10ed0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 70 61  ording to the pa
10ee0 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65 73 20  ge header, lies 
10ef0 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
10f00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
10f10 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
10f20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f30 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
10f40 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Page);.  }.  pPa
10f50 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
10f60 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
10f70 69 72 73 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e  irst);.  pPage->
10f80 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 72 65  isInit = 1;.  re
10f90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20  }../*.** Set up 
10fb0 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74 68  a raw page so th
10fc0 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65  at it looks like
10fd0 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
10fe0 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65   holding.** no e
10ff0 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ntries..*/.stati
11000 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28  c void zeroPage(
11010 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
11020 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e  int flags){.  un
11030 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
11040 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
11050 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
11060 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
11070 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67 65    u8 hdr = pPage
11080 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
11090 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73  16 first;..  ass
110a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
110b0 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67  rPagenumber(pPag
110c0 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
110d0 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73  ge->pgno );.  as
110e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
110f0 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
11100 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
11110 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
11120 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
11130 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
11140 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64  e->pDbPage) == d
11150 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
11160 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
11170 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
11180 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
11190 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
111a0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
111b0 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
111c0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
111d0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 20 29 7b  S_FAST_SECURE ){
111e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
111f0 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
11200 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
11210 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
11220 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
11230 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
11240 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
11250 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
11260 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
11270 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
11280 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
11290 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
112a0 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
112b0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
112c0 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
112d0 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
112e0 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
112f0 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
11300 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
11310 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
11320 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
11330 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
11340 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
11350 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
11360 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
11370 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
11380 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
11390 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
113a0 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
113b0 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
113c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
113d0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
113e0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
113f0 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
11400 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
11410 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
11420 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
11430 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
11440 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
11450 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
11460 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
11470 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
11480 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
11490 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
114a0 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
114b0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
114c0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
114d0 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
114e0 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
114f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
11500 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
11510 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
11520 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11530 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  a(pDbPage);.  if
11540 28 20 70 67 6e 6f 21 3d 70 50 61 67 65 2d 3e 70  ( pgno!=pPage->p
11550 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
11560 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65  ->aData = sqlite
11570 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11580 62 50 61 67 65 29 3b 0a 20 20 20 20 70 50 61 67  bPage);.    pPag
11590 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62  e->pDbPage = pDb
115a0 50 61 67 65 3b 0a 20 20 20 20 70 50 61 67 65 2d  Page;.    pPage-
115b0 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20  >pBt = pBt;.    
115c0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67  pPage->pgno = pg
115d0 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68  no;.    pPage->h
115e0 64 72 4f 66 66 73 65 74 20 3d 20 70 67 6e 6f 3d  drOffset = pgno=
115f0 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
11600 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
11610 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65  e->aData==sqlite
11620 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
11630 62 50 61 67 65 29 20 29 3b 0a 20 20 72 65 74 75  bPage) );.  retu
11640 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a  rn pPage; .}../*
11650 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11660 72 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20  rom the pager.  
11670 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d  Initialize the M
11680 65 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a  emPage.pBt and.*
11690 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20  * MemPage.aData 
116a0 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64  elements if need
116b0 65 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62  ed.  See also: b
116c0 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
116d0 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e()..**.** If th
116e0 65 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  e PAGER_GET_NOCO
116f0 4e 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65  NTENT flag is se
11700 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
11710 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a   we do not care.
11720 2a 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e  ** about the con
11730 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
11740 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
11750 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
11760 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
11770 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
11780 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
11790 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
117a0 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
117b0 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
117c0 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
117d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
117e0 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
117f0 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
11800 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
11810 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
11820 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
11830 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
11840 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
11850 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74  hat point..*/.st
11860 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65  atic int btreeGe
11870 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
11880 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
11890 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
118a0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
118b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
118c0 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
118d0 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
118e0 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
118f0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
11900 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
11910 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
11920 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11930 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11940 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
11950 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
11960 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
11970 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20  ge *pDbPage;..  
11980 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30  assert( flags==0
11990 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52   || flags==PAGER
119a0 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c  _GET_NOCONTENT |
119b0 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47  | flags==PAGER_G
119c0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20  ET_READONLY );. 
119d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
119e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
119f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
11a00 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11a10 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
11a20 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26  gno, (DbPage**)&
11a30 70 44 62 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  pDbPage, flags);
11a40 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
11a50 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65  rn rc;.  *ppPage
11a60 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
11a70 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
11a80 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65  pgno, pBt);.  re
11a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11aa0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76  }../*.** Retriev
11ab0 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
11ac0 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
11ad0 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
11ae0 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  page is not.** a
11af0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 70 61  lready in the pa
11b00 67 65 72 20 63 61 63 68 65 20 72 65 74 75 72 6e  ger cache return
11b10 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a   NULL. Initializ
11b20 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
11b30 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
11b40 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
11b50 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74  if needed..*/.st
11b60 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74  atic MemPage *bt
11b70 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74  reePageLookup(Bt
11b80 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
11b90 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  o pgno){.  DbPag
11ba0 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73  e *pDbPage;.  as
11bb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11bc0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11bd0 74 65 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67  tex) );.  pDbPag
11be0 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
11bf0 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
11c00 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
11c10 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
11c20 72 65 74 75 72 6e 20 62 74 72 65 65 50 61 67 65  return btreePage
11c30 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
11c40 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
11c50 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
11c60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
11c70 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11c80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
11c90 20 70 61 67 65 73 2e 20 49 66 20 74 68 65 72 65   pages. If there
11ca0 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a   is any kind of.
11cb0 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e  ** error, return
11cc0 20 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29   ((unsigned int)
11cd0 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  -1)..*/.static P
11ce0 67 6e 6f 20 62 74 72 65 65 50 61 67 65 63 6f 75  gno btreePagecou
11cf0 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
11d00 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d  ){.  return pBt-
11d10 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32 20 73 71  >nPage;.}.u32 sq
11d20 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 50 61  lite3BtreeLastPa
11d30 67 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ge(Btree *p){.  
11d40 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
11d50 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
11d60 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
11d70 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 29 26  (p->pBt->nPage)&
11d80 30 78 38 30 30 30 30 30 30 30 29 3d 3d 30 20 29  0x80000000)==0 )
11d90 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72 65 65  ;.  return btree
11da0 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70 42 74  Pagecount(p->pBt
11db0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  );.}../*.** Get 
11dc0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11dd0 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74 69 61  pager and initia
11de0 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49  lize it..**.** I
11df0 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e 20 74  f pCur!=0 then t
11e00 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
11e10 20 66 65 74 63 68 65 64 20 61 73 20 70 61 72 74   fetched as part
11e20 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   of a moveToChil
11e30 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20 44 6f  d().** call.  Do
11e40 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
11e50 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
11e60 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
11e70 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69 66 20  case..** And if 
11e80 74 68 65 20 66 65 74 63 68 20 66 61 69 6c 73 2c  the fetch fails,
11e90 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   this routine mu
11ea0 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70 43 75  st decrement pCu
11eb0 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  r->iPage..**.** 
11ec0 54 68 65 20 70 61 67 65 20 69 73 20 66 65 74 63  The page is fetc
11ed0 68 65 64 20 61 73 20 72 65 61 64 2d 77 72 69 74  hed as read-writ
11ee0 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20 69 73  e unless pCur is
11ef0 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20 69 73   not NULL and is
11f00 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  .** a read-only 
11f10 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  cursor..**.** If
11f20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
11f30 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69  , then *ppPage i
11f40 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49 74 0a  s undefined. It.
11f50 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20 75 6e  ** may remain un
11f60 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74 20 6d  changed, or it m
11f70 61 79 20 62 65 20 73 65 74 20 74 6f 20 61 6e 20  ay be set to an 
11f80 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e 0a 2a  invalid value..*
11f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
11fa0 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42  AndInitPage(.  B
11fb0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20  tShared *pBt,   
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fd0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
11fe0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
11ff0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
12000 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
12010 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
12020 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
12030 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
12040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
12050 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f 69  ite the page poi
12060 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 42  nter here */.  B
12070 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12090 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65 63 65  * Cursor to rece
120a0 69 76 65 20 74 68 65 20 70 61 67 65 2c 20 6f 72  ive the page, or
120b0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62   NULL */.  int b
120c0 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20 20 20  ReadOnly        
120d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
120e0 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
120f0 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20  ly page */.){.  
12100 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67 65  int rc;.  DbPage
12110 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73   *pDbPage;.  ass
12120 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
12130 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
12140 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12150 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70 50 61   pCur==0 || ppPa
12160 67 65 3d 3d 26 70 43 75 72 2d 3e 70 50 61 67 65  ge==&pCur->pPage
12170 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
12180 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
12190 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
121a0 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
121b0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
121c0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
121d0 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
121e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
121f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
12200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12210 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12220 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
12230 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
12240 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
12250 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
12260 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
12270 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
12280 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
12290 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
122a0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
122b0 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
122c0 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
122d0 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
122e0 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
122f0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
12300 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
12310 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
12320 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
12330 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
12340 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
12350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
12370 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
12380 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
12390 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
123a0 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
123b0 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
123c0 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
123d0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
123e0 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
123f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
12400 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
12410 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
12420 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
12430 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
12440 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
12450 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
12460 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
12470 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
12480 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
12490 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
124a0 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
124b0 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
124c0 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
124d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
124e0 4f 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f  ORRUPT_PGNO(pgno
124f0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
12500 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
12510 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
12520 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
12530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12540 4f 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50  OK;..getAndInitP
12550 61 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28  age_error:.  if(
12560 20 70 43 75 72 20 29 7b 0a 20 20 20 20 70 43 75   pCur ){.    pCu
12570 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->iPage--;.    
12580 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43  pCur->pPage = pC
12590 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
125a0 3e 69 50 61 67 65 5d 3b 0a 20 20 7d 0a 20 20 74  >iPage];.  }.  t
125b0 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d 30  estcase( pgno==0
125c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
125d0 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c  no!=0 || rc==SQL
125e0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a 20  ITE_CORRUPT );. 
125f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12600 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 4d  *.** Release a M
12610 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73 68  emPage.  This sh
12620 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 6f  ould be called o
12630 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72 69  nce for each pri
12640 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74  or.** call to bt
12650 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2a 0a 2a  reeGetPage..**.*
12660 2a 20 50 61 67 65 31 20 69 73 20 61 20 73 70 65  * Page1 is a spe
12670 63 69 61 6c 20 63 61 73 65 20 61 6e 64 20 6d 75  cial case and mu
12680 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20 75  st be released u
12690 73 69 6e 67 20 72 65 6c 65 61 73 65 50 61 67 65  sing releasePage
126a0 4f 6e 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  One()..*/.static
126b0 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
126c0 65 4e 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65  eNotNull(MemPage
126d0 20 2a 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65   *pPage){.  asse
126e0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
126f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12700 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73  age->pBt );.  as
12710 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62  sert( pPage->pDb
12720 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
12730 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
12740 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d  rGetExtra(pPage-
12750 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f  >pDbPage) == (vo
12760 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61  id*)pPage );.  a
12770 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
12780 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65  gerGetData(pPage
12790 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67  ->pDbPage)==pPag
127a0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
127b0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
127c0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
127d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
127e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
127f0 65 66 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d  efNotNull(pPage-
12800 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61  >pDbPage);.}.sta
12810 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
12820 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
12830 61 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67  age){.  if( pPag
12840 65 20 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e  e ) releasePageN
12850 6f 74 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d  otNull(pPage);.}
12860 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
12870 65 61 73 65 50 61 67 65 4f 6e 65 28 4d 65 6d 50  easePageOne(MemP
12880 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 61  age *pPage){.  a
12890 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
128a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
128b0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
128c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
128d0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
128e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
128f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12900 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12910 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
12920 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
12930 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
12940 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
12950 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
12960 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
12970 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
12980 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
12990 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
129a0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
129b0 33 50 61 67 65 72 55 6e 72 65 66 50 61 67 65 4f  3PagerUnrefPageO
129c0 6e 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ne(pPage->pDbPag
129d0 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  e);.}../*.** Get
129e0 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65 2e   an unused page.
129f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
12a00 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72 65  s just like btre
12a10 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68 20  eGetPage() with 
12a20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a 2a  the addition:.**
12a30 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65 20  .**   *  If the 
12a40 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79 20  page is already 
12a50 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65 20  in use for some 
12a60 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20 69  other purpose, i
12a70 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20 20  mmediately.**   
12a80 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61 6e     release it an
12a90 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  d return an SQLI
12aa0 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f 72  TE_CURRUPT error
12ab0 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20 73  ..**   *  Make s
12ac0 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20 66  ure the isInit f
12ad0 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f 0a  lag is clear.*/.
12ae0 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
12af0 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a 20  GetUnusedPage(. 
12b00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
12b10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
12b20 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
12b30 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
12b40 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
12b50 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
12b60 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
12b70 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
12b80 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12b90 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12ba0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
12bb0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
12bc0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
12bd0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
12be0 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
12bf0 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
12c00 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67  pBt, pgno, ppPag
12c10 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28  e, flags);.  if(
12c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12c30 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
12c40 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75  3PagerPageRefcou
12c50 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  nt((*ppPage)->pD
12c60 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20  bPage)>1 ){.    
12c70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
12c80 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
12c90 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  pPage = 0;.     
12ca0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
12cb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
12cc0 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65 29   }.    (*ppPage)
12cd0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12ce0 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50 61  }else{.    *ppPa
12cf0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ge = 0;.  }.  re
12d00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
12d10 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c  ** During a roll
12d20 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70  back, when the p
12d30 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66  ager reloads inf
12d40 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68  ormation into th
12d50 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68  e cache.** so th
12d60 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73 20  at the cache is 
12d70 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
12d80 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61  original state a
12d90 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
12da0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
12db0 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  n, for each page
12dc0 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20 72   restored this r
12dd0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
12de0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
12df0 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65  tine needs to re
12e00 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64 61  set the extra da
12e10 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68  ta section at th
12e20 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20  e end of the.** 
12e30 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77 69  page to agree wi
12e40 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64 20  th the restored 
12e50 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
12e60 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74 28  void pageReinit(
12e70 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b 0a  DbPage *pData){.
12e80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
12e90 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d  ;.  pPage = (Mem
12ea0 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61  Page *)sqlite3Pa
12eb0 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61 74  gerGetExtra(pDat
12ec0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  a);.  assert( sq
12ed0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12ee0 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30 20  fcount(pData)>0 
12ef0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
12f00 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61 73  isInit ){.    as
12f10 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
12f20 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
12f30 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12f40 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
12f50 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
12f60 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
12f70 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31 20  fcount(pData)>1 
12f80 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61 67  ){.      /* pPag
12f90 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  e might not be a
12fa0 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69 74   btree page;  it
12fb0 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76 65   might be an ove
12fc0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
12fd0 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70 61   ** or ptrmap pa
12fe0 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61 67  ge or a free pag
12ff0 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61 73  e.  In those cas
13000 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  es, the followin
13010 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 20  g.      ** call 
13020 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  to btreeInitPage
13030 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  () will likely r
13040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
13050 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20 42  RUPT..      ** B
13060 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64 6f  ut no harm is do
13070 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e 64  ne by this.  And
13080 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70 6f   it is very impo
13090 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20 20  rtant that.     
130a0 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61 67   ** btreeInitPag
130b0 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  e() be called on
130c0 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61 67   every btree pag
130d0 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20 20  e so we make.   
130e0 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 66     ** the call f
130f0 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74 68  or every page th
13100 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72 20  at comes in for 
13110 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a 20  re-initing. */. 
13120 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50 61       btreeInitPa
13130 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
13140 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
13150 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
13160 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65  ndler for a btre
13170 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13180 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
13190 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41  Handler(void *pA
131a0 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  rg){.  BtShared 
131b0 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
131c0 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
131d0 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
131e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
131f0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
13200 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
13210 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
13220 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
13230 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
13240 64 6c 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20  dler,.          
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
13270 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
13280 61 67 65 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ager));.}../*.**
13290 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
132a0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
132b0 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
132c0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
132d0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
132e0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
132f0 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
13300 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
13310 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
13320 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
13330 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
13340 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
13350 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
13360 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
13370 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
13380 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
13390 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
133a0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
133b0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
133c0 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
133d0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
133e0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
133f0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
13400 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
13410 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
13420 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
13430 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
13440 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
13450 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
13460 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
13470 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
13480 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
13490 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
134a0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
134b0 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
134c0 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
134d0 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
134e0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
134f0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
13500 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
13510 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13520 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
13530 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
13540 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
13550 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
13560 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
13570 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
13580 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
13590 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
135a0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
135b0 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
135c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
135d0 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
135e0 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
135f0 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
13600 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
13610 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
13620 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
13630 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
13640 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
13650 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
13660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
13670 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
13680 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
13690 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
136a0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
136b0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
136c0 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
136d0 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
136e0 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
136f0 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
13700 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
13710 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
13720 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
13730 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
13740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
13750 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
13760 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
13770 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
13780 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
13790 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
137a0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
137b0 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
137c0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
137d0 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
137e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
137f0 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
13800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13810 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
13820 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
13830 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
13840 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
13850 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
13860 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
13870 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
13880 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
13890 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
138a0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
138b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
138c0 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
138d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
138e0 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
138f0 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
13900 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
13910 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
13920 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
13930 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
13940 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
13950 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
13960 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
13970 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
13980 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
13990 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
139a0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
139b0 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
139c0 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
139d0 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
139e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
139f0 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
13a00 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
13a10 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
13a20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
13a30 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
13a40 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
13a50 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
13a60 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
13a70 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
13a80 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
13a90 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
13aa0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13ac0 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
13ad0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
13ae0 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
13b00 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
13b10 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
13b20 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
13b30 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
13b40 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
13b50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
13b60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
13b70 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
13b80 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
13b90 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
13ba0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
13bb0 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
13bc0 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
13bd0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
13be0 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
13bf0 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
13c00 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
13c10 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
13c20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
13c30 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
13c40 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
13c50 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
13c60 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
13c70 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
13c80 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
13c90 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
13ca0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
13cb0 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
13cc0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
13cd0 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
13ce0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
13cf0 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
13d00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13d10 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
13d20 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
13d30 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
13d40 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
13d50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13d60 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
13d70 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
13d80 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
13d90 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
13da0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
13db0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
13dc0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13dd0 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
13de0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13df0 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
13e00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13e10 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
13e20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
13e30 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
13e40 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
13e50 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
13e60 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
13e70 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
13e80 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
13e90 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
13ea0 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
13eb0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
13ec0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
13ed0 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
13ee0 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
13ef0 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13f00 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
13f10 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
13f20 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
13f30 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
13f40 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
13f50 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
13f60 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
13f70 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13f80 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
13f90 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
13fa0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
13fb0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
13fc0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
13fd0 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
13fe0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
13ff0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
14000 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
14010 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
14020 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
14030 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
14040 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14050 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
14060 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
14070 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
14080 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
14090 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
140a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
140b0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
140c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
140d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
140e0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d 65  }.      if( isMe
140f0 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  mdb ){.        m
14100 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61 74 68 6e  emcpy(zFullPathn
14110 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ame, zFilename, 
14120 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
14130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14140 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
14150 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73  ullPathname(pVfs
14160 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  nFullPathname, z
141a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
141b0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
141c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
141d0 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
141e0 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  hname);.        
141f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
14200 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
14210 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
14220 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 53 51  }.      }.#if SQ
14230 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
14240 20 20 20 20 20 20 6d 75 74 65 78 4f 70 65 6e 20        mutexOpen 
14250 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14260 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14270 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29 3b 0a 20  _STATIC_OPEN);. 
14280 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
14290 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 4f 70  ex_enter(mutexOp
142a0 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  en);.      mutex
142b0 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
142c0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
142d0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
142e0 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
142f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14300 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
14310 23 65 6e 64 69 66 0a 20 20 20 20 20 20 66 6f 72  #endif.      for
14320 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42 74 53 68  (pBt=GLOBAL(BtSh
14330 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
14340 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 20 70  redCacheList); p
14350 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e 70 4e 65  Bt; pBt=pBt->pNe
14360 78 74 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  xt){.        ass
14370 65 72 74 28 20 70 42 74 2d 3e 6e 52 65 66 3e 30  ert( pBt->nRef>0
14380 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
14390 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75 6c 6c 50  0==strcmp(zFullP
143a0 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  athname, sqlite3
143b0 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 70 42  PagerFilename(pB
143c0 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 29 0a 20  t->pPager, 0)). 
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
143e0 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
143f0 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
14400 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
14410 20 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 20 20     int iDb;.    
14420 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 64 62        for(iDb=db
14430 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e 3d 30 3b  ->nDb-1; iDb>=0;
14440 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 20   iDb--){.       
14450 20 20 20 20 20 42 74 72 65 65 20 2a 70 45 78 69       Btree *pExi
14460 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61 44 62 5b  sting = db->aDb[
14470 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  iDb].pBt;.      
14480 20 20 20 20 20 20 69 66 28 20 70 45 78 69 73 74        if( pExist
14490 69 6e 67 20 26 26 20 70 45 78 69 73 74 69 6e 67  ing && pExisting
144a0 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b 0a 20 20  ->pBt==pBt ){.  
144b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
144c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
144d0 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
144e0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
144f0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14500 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
14510 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14520 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68  3_free(zFullPath
14530 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
14540 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
14550 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
14560 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14570 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20  E_CONSTRAINT;.  
14580 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
145a0 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a    p->pBt = pBt;.
145b0 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e            pBt->n
145c0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Ref++;.         
145d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
145e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
145f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14600 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29  ave(mutexShared)
14610 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14620 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  free(zFullPathna
14630 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  me);.    }.#ifde
14640 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
14650 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f     else{.      /
14660 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c  * In debug mode,
14670 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65 72   we mark all per
14680 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73 65  sistent database
14690 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20 20  s as sharable.  
146a0 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65 6e      ** even when
146b0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20 20   they are not.  
146c0 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20 74  This exercises t
146d0 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65 20  he locking code 
146e0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69 76  and.      ** giv
146f0 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e  es more opportun
14700 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73 28  ity for asserts(
14710 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14720 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20 73  ld()).      ** s
14730 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69 6e  tatements to fin
14740 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c 65  d locking proble
14750 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ms..      */.   
14760 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
14770 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
14780 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
14790 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pBt==0 ){.    
147a0 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f  /*.    ** The fo
147b0 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20  llowing asserts 
147c0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 73  make sure that s
147d0 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20 62  tructures used b
147e0 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65 0a  y the btree are.
147f0 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68 74      ** the right
14800 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73 20   size.  This is 
14810 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73 74  to guard against
14820 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74 68   size changes th
14830 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a  at result.    **
14840 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
14850 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 61  on a different a
14860 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20 20  rchitecture..   
14870 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
14880 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20 29  sizeof(i64)==8 )
14890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
148a0 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20 29 3b 0a  zeof(u64)==8 );.
148b0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
148c0 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b 0a 20 20  of(u32)==4 );.  
148d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
148e0 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20 20 20 20  (u16)==2 );.    
148f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 50  assert( sizeof(P
14900 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20 0a 20 20  gno)==4 );.  .  
14910 20 20 70 42 74 20 3d 20 73 71 6c 69 74 65 33 4d    pBt = sqlite3M
14920 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
14930 66 28 2a 70 42 74 29 20 29 3b 0a 20 20 20 20 69  f(*pBt) );.    i
14940 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
14950 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14960 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
14970 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
14980 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
14990 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
149a0 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42 74  rOpen(pVfs, &pBt
149b0 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65 6e  ->pPager, zFilen
149c0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
149e0 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 2c 20  izeof(MemPage), 
149f0 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
14a00 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
14a10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14a20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
14a30 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
14a40 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
14a50 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
14a60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
14a70 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
14a80 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
14a90 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
14aa0 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
14ab0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
14ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14ad0 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
14ae0 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
14af0 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
14b00 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
14b10 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
14b20 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
14b30 65 72 53 65 74 42 75 73 79 48 61 6e 64 6c 65 72  erSetBusyHandler
14b40 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
14b50 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
14b60 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
14b70 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
14b80 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
14b90 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
14ba0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
14bb0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
14bc0 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
14bd0 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
14be0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
14bf0 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 20 64 65  EAD_ONLY;.#if de
14c00 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 45 43  fined(SQLITE_SEC
14c10 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20 20  URE_DELETE).    
14c20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
14c30 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
14c40 54 45 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  TE;.#elif define
14c50 64 28 53 51 4c 49 54 45 5f 46 41 53 54 5f 53 45  d(SQLITE_FAST_SE
14c60 43 55 52 45 5f 44 45 4c 45 54 45 29 0a 20 20 20  CURE_DELETE).   
14c70 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
14c80 3d 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3b  = BTS_OVERWRITE;
14c90 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
14ca0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
14cb0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
14cc0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
14cd0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
14ce0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
14cf0 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
14d00 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
14d10 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
14d20 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
14d30 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
14d40 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
14d50 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
14d60 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
14d70 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
14d80 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
14d90 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
14da0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
14db0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
14dc0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
14dd0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
14de0 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
14df0 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
14e00 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
14e10 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
14e20 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
14e30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
14e40 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
14e50 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
14e60 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
14e70 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
14e80 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
14e90 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
14ea0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
14eb0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
14ec0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
14ed0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
14ee0 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
14ef0 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
14f00 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
14f10 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
14f20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
14f30 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
14f40 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
14f50 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
14f60 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
14f70 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
14f80 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
14f90 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
14fa0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
14fb0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
14fc0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
14fd0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
14fe0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
14ff0 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
15000 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
15010 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
15020 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
15030 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
15040 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
15050 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
15060 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
15070 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
15080 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
15090 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
150a0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
150b0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
150c0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
150d0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
150e0 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
150f0 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
15100 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
15110 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
15120 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
15130 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15140 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
15150 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
15160 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
15170 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
15180 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
15190 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
151a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
151b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
151c0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
151d0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
151e0 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
151f0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
15200 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
15210 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
15220 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
15230 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
15240 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
15250 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
15260 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
15270 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
15280 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
15290 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
152a0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
152b0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
152c0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
152d0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
152e0 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
152f0 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
15300 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
15310 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
15320 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
15330 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15340 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15350 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
15360 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
15370 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
15380 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
15390 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
153a0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
153b0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
153c0 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 6e 52 65   */.    pBt->nRe
153d0 66 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70  f = 1;.    if( p
153e0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
153f0 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
15400 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
15410 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 20  mutexShared; ). 
15420 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
15430 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
15440 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
15450 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
15460 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
15470 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
15480 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
15490 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
154a0 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
154b0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
154c0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
154d0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
154e0 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
154f0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
15500 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
15510 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15520 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
15530 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
15540 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20  open_out;.      
15550 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15560 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15570 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65  enter(mutexShare
15580 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  d);.      pBt->p
15590 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  Next = GLOBAL(Bt
155a0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
155b0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
155c0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
155d0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
155e0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
155f0 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
15600 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15610 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
15620 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
15630 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15640 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15650 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
15660 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15670 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
15680 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
15690 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
156a0 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
156b0 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
156c0 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
156d0 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
156e0 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
156f0 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
15700 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
15710 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
15720 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
15730 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
15740 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
15750 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
15760 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
15770 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
15780 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
15790 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
157a0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
157b0 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
157c0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
157d0 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
157e0 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
157f0 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
15800 20 20 20 20 20 20 20 69 66 28 20 28 75 70 74 72         if( (uptr
15810 29 70 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 53  )p->pBt<(uptr)pS
15820 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  ib->pBt ){.     
15830 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
15840 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
15850 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  p->pPrev = 0;.  
15860 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50          pSib->pP
15870 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
15880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15890 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
158a0 4e 65 78 74 20 26 26 20 28 75 70 74 72 29 70 53  Next && (uptr)pS
158b0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 28  ib->pNext->pBt<(
158c0 75 70 74 72 29 70 2d 3e 70 42 74 20 29 7b 0a 20  uptr)p->pBt ){. 
158d0 20 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20             pSib 
158e0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
158f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15900 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20       p->pNext = 
15910 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
15920 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20         p->pPrev 
15930 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20  = pSib;.        
15940 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
15950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
15960 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15970 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
15980 20 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70           pSib->p
15990 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Next = p;.      
159a0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
159b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
159c0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70  .  }.#endif.  *p
159d0 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72  pBtree = p;..btr
159e0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69  ee_open_out:.  i
159f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15a00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20   ){.    if( pBt 
15a10 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
15a20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15a30 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
15a40 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
15a50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15a60 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
15a70 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
15a80 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
15a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
15aa0 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 3b  te3_file *pFile;
15ab0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
15ac0 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63 65  B-Tree was succe
15ad0 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20  ssfully opened, 
15ae0 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63 61  set the pager-ca
15af0 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65 0a  che size to the.
15b00 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 76      ** default v
15b10 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77 68  alue. Except, wh
15b20 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e  en opening on an
15b30 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
15b40 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20 20   pager-cache,.  
15b50 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e    ** do not chan
15b60 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  ge the pager-cac
15b70 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a  he size..    */.
15b80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
15b90 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30 2c  treeSchema(p, 0,
15ba0 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   0)==0 ){.      
15bb0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
15bc0 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d  achesize(p->pBt-
15bd0 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45 5f  >pPager, SQLITE_
15be0 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
15bf0 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ZE);.    }..    
15c00 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
15c10 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50  agerFile(pBt->pP
15c20 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
15c30 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  File->pMethods )
15c40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
15c50 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 48 69 6e 74  sFileControlHint
15c60 28 70 46 69 6c 65 2c 20 53 51 4c 49 54 45 5f 46  (pFile, SQLITE_F
15c70 43 4e 54 4c 5f 50 44 42 2c 20 28 76 6f 69 64 2a  CNTL_PDB, (void*
15c80 29 26 70 42 74 2d 3e 64 62 29 3b 0a 20 20 20 20  )&pBt->db);.    
15c90 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65  }.  }.  if( mute
15ca0 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  xOpen ){.    ass
15cb0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15cc0 65 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65  ex_held(mutexOpe
15cd0 6e 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  n) );.    sqlite
15ce0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
15cf0 74 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20  texOpen);.  }.  
15d00 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15d10 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
15d20 42 74 72 65 65 43 6f 6e 6e 65 63 74 69 6f 6e 43  BtreeConnectionC
15d30 6f 75 6e 74 28 2a 70 70 42 74 72 65 65 29 3e 30  ount(*ppBtree)>0
15d40 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
15d50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
15d60 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
15d70 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
15d80 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
15d90 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
15da0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
15db0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
15dc0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
15dd0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
15de0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
15df0 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
15e00 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
15e10 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
15e20 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
15e30 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
15e40 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
15e50 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
15e60 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
15e70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
15e80 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
15e90 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15ea0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
15eb0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
15ec0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
15ed0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
15ee0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15ef0 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
15f00 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
15f10 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
15f20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
15f30 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
15f40 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
15f50 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
15f60 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
15f70 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
15f80 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
15f90 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
15fa0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
15fb0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
15fc0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
15fd0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
15fe0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
15ff0 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
16000 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
16010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16020 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
16030 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
16040 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
16050 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
16060 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
16070 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
16090 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
160a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
160b0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
160c0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
160d0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
160e0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
160f0 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
16100 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
16110 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
16120 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
16130 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
16140 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
16150 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
16160 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
16170 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
16180 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
16190 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
161a0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
161b0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
161c0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
161d0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
161e0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
161f0 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
16200 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
16210 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
16220 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
16230 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
16240 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
16250 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
16260 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
16270 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16280 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
16290 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
162a0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
162b0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
162c0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
162d0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
162e0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
162f0 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
16300 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
16310 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
16320 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
16330 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
16340 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
16350 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
16360 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
16370 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
16380 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
16390 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
163a0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
163b0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
163c0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
163d0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
163e0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
163f0 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
16400 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
16410 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
16420 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
16430 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
16440 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
16450 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
16460 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
16470 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
16480 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
16490 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
164a0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
164b0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
164c0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
164d0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
164e0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
164f0 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
16500 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
16510 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
16520 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
16530 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
16540 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
16550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
16560 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
16570 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
16580 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
16590 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
165a0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
165b0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
165c0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
165d0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
165e0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
165f0 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
16600 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
16610 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
16620 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16630 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
16640 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
16650 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
16660 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
16670 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16680 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
16690 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
166a0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
166b0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
166c0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
166d0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
166e0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
166f0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
16700 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
16710 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
16720 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
16730 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
16740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
16750 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
16760 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
16770 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
16780 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16790 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
167a0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
167b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
167c0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
167d0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
167e0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
167f0 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
16800 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
16810 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16820 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16830 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16840 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
16850 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
16860 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
16870 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
16880 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
16890 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
168a0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
168b0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
168c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
168d0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
168e0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
168f0 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
16900 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
16910 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
16920 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
16930 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
16940 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
16950 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
16960 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
16970 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
16980 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
16990 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
169a0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
169b0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
169c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
169d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
169e0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
169f0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
16a00 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
16a10 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
16a20 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
16a30 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
16a40 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
16a50 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
16a60 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
16a70 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
16a80 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16a90 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
16aa0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
16ab0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
16ac0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
16ad0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
16ae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
16af0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
16b00 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
16b10 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
16b20 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
16b30 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
16b40 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
16b50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
16b60 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
16b70 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
16b80 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
16b90 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16ba0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
16bb0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
16bc0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d  (pBt->pPager, p-
16bd0 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42  >db);.    if( pB
16be0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
16bf0 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
16c00 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
16c10 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
16c20 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
16c30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16c40 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 29  0, pBt->pSchema)
16c50 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53 70  ;.    freeTempSp
16c60 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71  ace(pBt);.    sq
16c70 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b  lite3_free(pBt);
16c80 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
16c90 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
16ca0 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74 28  _CACHE.  assert(
16cb0 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
16cc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
16cd0 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
16ce0 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 20   if( p->pPrev ) 
16cf0 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  p->pPrev->pNext 
16d00 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66  = p->pNext;.  if
16d10 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e  ( p->pNext ) p->
16d20 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
16d30 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a  ->pPrev;.#endif.
16d40 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
16d50 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16d60 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16d70 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f 66   Change the "sof
16d80 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  t" limit on the 
16d90 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
16da0 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  in the cache..**
16db0 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d 6f   Unused and unmo
16dc0 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69 6c  dified pages wil
16dd0 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77 68  l be recycled wh
16de0 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
16df0 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68 65  .** pages in the
16e00 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20 74   cache exceeds t
16e10 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e 20  his soft limit. 
16e20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f 66   But the size of
16e30 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69 73   the.** cache is
16e40 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f 77   allowed to grow
16e50 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
16e60 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63 6f  s limit if it co
16e70 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79 20  ntains.** dirty 
16e80 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20 73  pages or pages s
16e90 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20 75  till in active u
16ea0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
16eb0 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
16ec0 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
16ed0 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
16ee0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
16ef0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
16f00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16f10 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
16f20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16f30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
16f40 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
16f50 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
16f60 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
16f70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16f80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
16f90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16fa0 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70 69   Change the "spi
16fb0 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ll" limit on the
16fc0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16fd0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
16fe0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
16ff0 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64 73  of pages exceeds
17000 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72 69   this limit duri
17010 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ng a write trans
17020 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20 70  action,.** the p
17030 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65 6d  ager might attem
17040 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70 61  pt to "spill" pa
17050 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ges to the journ
17060 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20 6f  al early in.** o
17070 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
17080 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
17090 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
170a0 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   is the current 
170b0 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66 20  spill size.  If 
170c0 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a 2a  zero is passed.*
170d0 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  * as an argument
170e0 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  , no changes are
170f0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70 69   made to the spi
17100 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67 2c  ll size setting,
17110 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78 50   so.** using mxP
17120 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77 61  age of 0 is a wa
17130 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 63  y to query the c
17140 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a  urrent spill siz
17150 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17160 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53 69  3BtreeSetSpillSi
17170 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  ze(Btree *p, int
17180 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53 68   mxPage){.  BtSh
17190 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
171a0 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  Bt;.  int res;. 
171b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
171c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
171d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
171e0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
171f0 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  (p);.  res = sql
17200 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69 6c  ite3PagerSetSpil
17210 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  lsize(pBt->pPage
17220 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
17230 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17240 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  p);.  return res
17250 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
17260 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
17270 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17280 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61 6d   limit on the am
17290 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74 61  ount of the data
172a0 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20 6d  base file that m
172b0 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  ay be.** memory 
172c0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  mapped..*/.int s
172d0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d 6d  qlite3BtreeSetMm
172e0 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a 70  apLimit(Btree *p
172f0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
17300 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68 61  szMmap){.  BtSha
17310 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
17320 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
17330 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17340 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
17350 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
17360 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
17370 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
17380 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
17390 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c 69   szMmap);.  sqli
173a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
173b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
173c0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
173d0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
173e0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
173f0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
17400 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
17410 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
17420 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
17430 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
17440 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
17450 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
17460 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
17470 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
17480 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
17490 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
174a0 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
174b0 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
174c0 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
174d0 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
174e0 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
174f0 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
17500 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
17510 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
17520 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
17530 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
17540 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
17550 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
17560 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
17570 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
17580 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
17590 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
175a0 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
175b0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
175c0 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
175d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
175e0 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42 74  PagerFlags(.  Bt
175f0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
17600 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
17610 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61 66  e to set the saf
17620 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f 0a  ety level on */.
17630 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c 61    unsigned pgFla
17640 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69  gs       /* Vari
17650 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61 67  ous PAGER_* flag
17660 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  s */.){.  BtShar
17670 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17680 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
17690 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
176a0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
176b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
176c0 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
176d0 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28 70  3PagerSetFlags(p
176e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46 6c  Bt->pPager, pgFl
176f0 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
17700 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17720 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
17730 2a 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66  * Change the def
17740 61 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20  ault pages size 
17750 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
17760 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73  f reserved bytes
17770 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72   per page..** Or
17780 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69  , if the page si
17790 7a 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  ze has already b
177a0 65 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72  een fixed, retur
177b0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
177c0 59 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68  Y .** without ch
177d0 61 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e  anging anything.
177e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
177f0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
17800 6f 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65  ower of 2 betwee
17810 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e  n 512 and 65536.
17820 20 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a    If the page.**
17830 20 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64   size supplied d
17840 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69  oes not meet thi
17850 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65  s constraint the
17860 6e 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  n the page size 
17870 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65  is not.** change
17880 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69  d..**.** Page si
17890 7a 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69  zes are constrai
178a0 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65  ned to be a powe
178b0 72 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74  r of two so that
178c0 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f   the region.** o
178d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
178e0 69 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ile used for loc
178f0 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20  king (beginning 
17900 61 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  at PENDING_BYTE,
17910 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79  .** the first by
17920 74 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20  te past the 1GB 
17930 62 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30  boundary, 0x4000
17940 30 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f  0000) needs to o
17950 63 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62  ccur.** at the b
17960 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61  eginning of a pa
17970 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  ge..**.** If par
17980 61 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20  ameter nReserve 
17990 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
179a0 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62  o, then the numb
179b0 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a  er of reserved.*
179c0 2a 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65  * bytes per page
179d0 20 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67   is left unchang
179e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
179f0 20 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68   iFix!=0 then th
17a00 65 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  e BTS_PAGESIZE_F
17a10 49 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74  IXED flag is set
17a20 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67   so that the pag
17a30 65 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75  e size.** and au
17a40 74 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61  tovacuum mode ca
17a50 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63  n no longer be c
17a60 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
17a70 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
17a80 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  geSize(Btree *p,
17a90 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69   int pageSize, i
17aa0 6e 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74  nt nReserve, int
17ab0 20 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63   iFix){.  int rc
17ac0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17ad0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17ae0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
17af0 28 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26  ( nReserve>=-1 &
17b00 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
17b10 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17b20 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53  eEnter(p);.#if S
17b30 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
17b40 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70    if( nReserve>p
17b50 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
17b60 76 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61  ve ) pBt->optima
17b70 6c 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e  lReserve = (u8)n
17b80 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
17b90 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
17ba0 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49  ags & BTS_PAGESI
17bb0 5a 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20  ZE_FIXED ){.    
17bc0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17bd0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
17be0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17bf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
17c00 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
17c10 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
17c20 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
17c30 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
17c40 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
17c50 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c  >=0 && nReserve<
17c60 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61  =255 );.  if( pa
17c70 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
17c80 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
17c90 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
17ca0 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
17cb0 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
17cc0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
17cd0 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
17ce0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
17cf0 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f  rt( !pBt->pCurso
17d00 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
17d10 67 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61  geSize = (u32)pa
17d20 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
17d30 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
17d40 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
17d50 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
17d60 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
17d70 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20  &pBt->pageSize, 
17d80 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74  nReserve);.  pBt
17d90 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
17da0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28  Bt->pageSize - (
17db0 75 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20  u16)nReserve;.  
17dc0 69 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e  if( iFix ) pBt->
17dd0 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17de0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a  PAGESIZE_FIXED;.
17df0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17e00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17e10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
17e20 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
17e30 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20  ly defined page 
17e40 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  size.*/.int sqli
17e50 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53  te3BtreeGetPageS
17e60 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ize(Btree *p){. 
17e70 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e   return p->pBt->
17e80 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  pageSize;.}../*.
17e90 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17ea0 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73   is similar to s
17eb0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65  qlite3BtreeGetRe
17ec0 73 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20  serve(), except 
17ed0 74 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f  that it.** may o
17ee0 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66  nly be called if
17ef0 20 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65   it is guarantee
17f00 64 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65  d that the b-tre
17f10 65 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61  e mutex is alrea
17f20 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a  dy.** held..**.*
17f30 2a 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c  * This is useful
17f40 20 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20   in one special 
17f50 63 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b  case in the back
17f60 75 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72  up API code wher
17f70 65 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e  e it is.** known
17f80 20 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64   that the shared
17f90 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
17fa0 20 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d   held, but the m
17fb0 75 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  utex on the .** 
17fc0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
17fd0 74 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20  that owns *p is 
17fe0 6e 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73  not. In this cas
17ff0 65 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65  e if sqlite3Btre
18000 65 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65  eEnter().** were
18010 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69   to be called, i
18020 74 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20  t might collide 
18030 77 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20  with some other 
18040 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
18050 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
18060 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
18070 2c 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69  , causing undefi
18080 6e 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  ned behavior..*/
18090 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
180a0 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74  eGetReserveNoMut
180b0 65 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ex(Btree *p){.  
180c0 69 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  int n;.  assert(
180d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
180e0 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65  eld(p->pBt->mute
180f0 78 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70  x) );.  n = p->p
18100 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
18110 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
18120 65 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  e;.  return n;.}
18130 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18150 65 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74  es of space at t
18160 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
18170 70 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65  page that.** are
18180 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66   intentually lef
18190 74 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20  t unused.  This 
181a0 69 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64  is the "reserved
181b0 22 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a  " space that is.
181c0 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65  ** sometimes use
181d0 64 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e  d by extensions.
181e0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
181f0 5f 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65  _HAS_MUTEX is de
18200 66 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e  fined then the n
18210 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69  umber returned i
18220 73 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72  s the.** greater
18230 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
18240 72 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61  reserved space a
18250 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72  nd the maximum r
18260 65 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65  equested.** rese
18270 72 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e  rve space..*/.in
18280 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
18290 74 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28  tOptimalReserve(
182a0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
182b0 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   n;.  sqlite3Btr
182c0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20  eeEnter(p);.  n 
182d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
182e0 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28  tReserveNoMutex(
182f0 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
18300 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
18310 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69  ( n<p->pBt->opti
18320 6d 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d  malReserve ) n =
18330 20 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c   p->pBt->optimal
18340 52 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a  Reserve;.#endif.
18350 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
18360 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
18370 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65   n;.}.../*.** Se
18380 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
18390 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
183a0 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
183b0 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
183c0 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
183d0 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
183e0 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
183f0 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
18400 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
18410 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
18420 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
18430 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
18440 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
18450 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
18460 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
18470 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
18480 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
18490 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
184a0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
184b0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
184c0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
184d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
184e0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
184f0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
18500 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 42 54  alues for the BT
18510 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18520 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18530 45 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  E flags:.**.**  
18540 20 20 6e 65 77 46 6c 61 67 3d 3d 30 20 20 20 20    newFlag==0    
18550 20 20 20 42 6f 74 68 20 42 54 53 5f 53 45 43 55     Both BTS_SECU
18560 52 45 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54  RE_DELETE and BT
18570 53 5f 4f 56 45 52 57 52 49 54 45 20 61 72 65 20  S_OVERWRITE are 
18580 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65  cleared.**    ne
18590 77 46 6c 61 67 3d 3d 31 20 20 20 20 20 20 20 42  wFlag==1       B
185a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
185b0 20 73 65 74 20 61 6e 64 20 42 54 53 5f 4f 56 45   set and BTS_OVE
185c0 52 57 52 49 54 45 20 69 73 20 63 6c 65 61 72 65  RWRITE is cleare
185d0 64 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  d.**    newFlag=
185e0 3d 32 20 20 20 20 20 20 20 42 54 53 5f 53 45 43  =2       BTS_SEC
185f0 55 52 45 5f 44 45 4c 45 54 45 20 63 6c 65 61 72  URE_DELETE clear
18600 65 64 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57  ed and BTS_OVERW
18610 52 49 54 45 20 69 73 20 73 65 74 0a 2a 2a 20 20  RITE is set.**  
18620 20 20 6e 65 77 46 6c 61 67 3d 3d 28 2d 31 29 20    newFlag==(-1) 
18630 20 20 20 4e 6f 20 63 68 61 6e 67 65 73 0a 2a 2a     No changes.**
18640 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18650 20 61 63 74 73 20 61 73 20 61 20 71 75 65 72 79   acts as a query
18660 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 6c   if newFlag is l
18670 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 0a 2a 2a  ess than zero.**
18680 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 4f 56 45  .** With BTS_OVE
18690 52 57 52 49 54 45 20 73 65 74 2c 20 64 65 6c 65  RWRITE set, dele
186a0 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20 6f  ted content is o
186b0 76 65 72 77 72 69 74 74 65 6e 20 62 79 20 7a 65  verwritten by ze
186c0 72 6f 73 2c 20 62 75 74 0a 2a 2a 20 66 72 65 65  ros, but.** free
186d0 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20  list leaf pages 
186e0 61 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  are not written 
186f0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
18700 62 61 73 65 2e 20 20 54 68 75 73 20 69 6e 2d 70  base.  Thus in-p
18710 61 67 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 63  age.** deleted c
18720 6f 6e 74 65 6e 74 20 69 73 20 63 6c 65 61 72 65  ontent is cleare
18730 64 2c 20 62 75 74 20 66 72 65 65 6c 69 73 74 20  d, but freelist 
18740 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20  deleted content 
18750 69 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 57 69  is not..**.** Wi
18760 74 68 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  th BTS_SECURE_DE
18770 4c 45 54 45 2c 20 6f 70 65 72 61 74 69 6f 6e 20  LETE, operation 
18780 69 73 20 6c 69 6b 65 20 42 54 53 5f 4f 56 45 52  is like BTS_OVER
18790 57 52 49 54 45 20 77 69 74 68 20 74 68 65 20 61  WRITE with the a
187a0 64 64 69 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  ddition.** that 
187b0 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
187c0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
187d0 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
187e0 74 61 62 61 73 65 2c 20 69 6e 63 72 65 61 73 69  tabase, increasi
187f0 6e 67 0a 2a 2a 20 74 68 65 20 61 6d 6f 75 6e 74  ng.** the amount
18800 20 6f 66 20 64 69 73 6b 20 49 2f 4f 2e 0a 2a 2f   of disk I/O..*/
18810 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18820 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42 74  eSecureDelete(Bt
18830 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77 46  ree *p, int newF
18840 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a 20  lag){.  int b;. 
18850 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
18860 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42  rn 0;.  sqlite3B
18870 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
18880 61 73 73 65 72 74 28 20 42 54 53 5f 4f 56 45 52  assert( BTS_OVER
18890 57 52 49 54 45 3d 3d 42 54 53 5f 53 45 43 55 52  WRITE==BTS_SECUR
188a0 45 5f 44 45 4c 45 54 45 2a 32 20 29 3b 0a 20 20  E_DELETE*2 );.  
188b0 61 73 73 65 72 74 28 20 42 54 53 5f 46 41 53 54  assert( BTS_FAST
188c0 5f 53 45 43 55 52 45 3d 3d 28 42 54 53 5f 4f 56  _SECURE==(BTS_OV
188d0 45 52 57 52 49 54 45 7c 42 54 53 5f 53 45 43 55  ERWRITE|BTS_SECU
188e0 52 45 5f 44 45 4c 45 54 45 29 20 29 3b 0a 20 20  RE_DELETE) );.  
188f0 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20 29  if( newFlag>=0 )
18900 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  {.    p->pBt->bt
18910 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 46  sFlags &= ~BTS_F
18920 41 53 54 5f 53 45 43 55 52 45 3b 0a 20 20 20 20  AST_SECURE;.    
18930 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
18940 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44   |= BTS_SECURE_D
18950 45 4c 45 54 45 2a 6e 65 77 46 6c 61 67 3b 0a 20  ELETE*newFlag;. 
18960 20 7d 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74   }.  b = (p->pBt
18970 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
18980 5f 46 41 53 54 5f 53 45 43 55 52 45 29 2f 42 54  _FAST_SECURE)/BT
18990 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
189a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
189b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
189c0 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
189d0 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
189e0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
189f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
18a00 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
18a10 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
18a20 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
18a30 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
18a40 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
18a50 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
18a60 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
18a70 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
18a80 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
18a90 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
18aa0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
18ab0 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
18ac0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
18ad0 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
18ae0 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
18af0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
18b00 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
18b10 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18b20 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18b40 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
18b50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
18b60 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
18b70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18b80 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
18b90 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
18ba0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18bb0 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
18bc0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
18bd0 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
18be0 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
18bf0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
18c00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
18c10 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
18c20 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
18c30 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
18c40 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
18c50 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
18c60 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
18c70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
18c80 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
18c90 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
18ca0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
18cb0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
18cc0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
18cd0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
18ce0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
18cf0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
18d00 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
18d10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
18d20 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
18d30 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
18d40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
18d50 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
18d60 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
18d70 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
18d80 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
18d90 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
18da0 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
18db0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
18dc0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
18dd0 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
18de0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
18df0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
18e00 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
18e10 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
18e20 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
18e30 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
18e40 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
18e50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
18e60 20 75 73 65 72 20 68 61 73 20 6e 6f 74 20 73 65   user has not se
18e70 74 20 74 68 65 20 73 61 66 65 74 79 2d 6c 65 76  t the safety-lev
18e80 65 6c 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  el for this data
18e90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
18ea0 2a 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d 41  ** using "PRAGMA
18eb0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 22 2c 20 61   synchronous", a
18ec0 6e 64 20 69 66 20 74 68 65 20 73 61 66 65 74 79  nd if the safety
18ed0 2d 6c 65 76 65 6c 20 69 73 20 6e 6f 74 20 61 6c  -level is not al
18ee0 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 74 6f 20  ready.** set to 
18ef0 74 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64  the value passed
18f00 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
18f10 6e 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  n as the second 
18f20 70 61 72 61 6d 65 74 65 72 2c 0a 2a 2a 20 73 65  parameter,.** se
18f30 74 20 69 74 20 73 6f 2e 0a 2a 2f 0a 23 69 66 20  t it so..*/.#if 
18f40 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18f50 59 4e 43 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49  YNCHRONOUS!=SQLI
18f60 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
18f70 59 4e 43 48 52 4f 4e 4f 55 53 20 5c 0a 20 20 20  YNCHRONOUS \.   
18f80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
18f90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 73 74  ITE_OMIT_WAL).st
18fa0 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 66  atic void setDef
18fb0 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 42 74 53  aultSyncFlag(BtS
18fc0 68 61 72 65 64 20 2a 70 42 74 2c 20 75 38 20 73  hared *pBt, u8 s
18fd0 61 66 65 74 79 5f 6c 65 76 65 6c 29 7b 0a 20 20  afety_level){.  
18fe0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
18ff0 62 20 2a 70 44 62 3b 0a 20 20 69 66 28 20 28 64  b *pDb;.  if( (d
19000 62 3d 70 42 74 2d 3e 64 62 29 21 3d 30 20 26 26  b=pBt->db)!=0 &&
19010 20 28 70 44 62 3d 64 62 2d 3e 61 44 62 29 21 3d   (pDb=db->aDb)!=
19020 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
19030 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70  pDb->pBt==0 || p
19040 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d 70 42  Db->pBt->pBt!=pB
19050 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a 20 20  t ){ pDb++; }.  
19060 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e 63    if( pDb->bSync
19070 53 65 74 3d 3d 30 20 0a 20 20 20 20 20 26 26 20  Set==0 .     && 
19080 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
19090 6c 21 3d 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  l!=safety_level 
190a0 0a 20 20 20 20 20 26 26 20 70 44 62 21 3d 26 64  .     && pDb!=&d
190b0 62 2d 3e 61 44 62 5b 31 5d 20 0a 20 20 20 20 29  b->aDb[1] .    )
190c0 7b 0a 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66  {.      pDb->saf
190d0 65 74 79 5f 6c 65 76 65 6c 20 3d 20 73 61 66 65  ety_level = safe
190e0 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
190f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
19100 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
19110 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d  ,.          pDb-
19120 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20  >safety_level | 
19130 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 50 41 47  (db->flags & PAG
19140 45 52 5f 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b  ER_FLAGS_MASK));
19150 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c  .    }.  }.}.#el
19160 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 44  se.# define setD
19170 65 66 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70  efaultSyncFlag(p
19180 42 74 2c 73 61 66 65 74 79 5f 6c 65 76 65 6c 29  Bt,safety_level)
19190 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 46 6f 72 77  .#endif../* Forw
191a0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
191b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 65  */.static int ne
191c0 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61 72  wDatabase(BtShar
191d0 65 64 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65  ed*);.../*.** Ge
191e0 74 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  t a reference to
191f0 20 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64   pPage1 of the d
19200 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
19210 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f  his will.** also
19220 20 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c   acquire a readl
19230 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  ock on that file
19240 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
19250 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
19260 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68   success.  If th
19270 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a  e file is not a.
19280 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  ** well-formed d
19290 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
192a0 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  en SQLITE_CORRUP
192b0 54 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  T is returned..*
192c0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
192d0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
192e0 20 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63   database is loc
192f0 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d  ked.  SQLITE_NOM
19300 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  EM.** is returne
19310 64 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20  d if we run out 
19320 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73  of memory. .*/.s
19330 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74  tatic int lockBt
19340 72 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ree(BtShared *pB
19350 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  t){.  int rc;   
19360 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
19370 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73  sult code from s
19380 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20  ubfunctions */. 
19390 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
193a0 3b 20 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20  ;     /* Page 1 
193b0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
193c0 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50  file */.  u32 nP
193d0 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
193e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
193f0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
19400 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67 65  e */.  u32 nPage
19410 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  File = 0;   /* N
19420 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
19430 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
19440 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ile */.  u32 nPa
19450 67 65 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a  geHeader;     /*
19460 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
19470 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
19480 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64   according to hd
19490 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
194a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
194b0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
194c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
194d0 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20  >pPage1==0 );.  
194e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
194f0 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d  rSharedLock(pBt-
19500 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  >pPager);.  if( 
19510 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19520 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
19530 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
19540 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  Bt, 1, &pPage1, 
19550 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
19560 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
19570 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f   rc;..  /* Do so
19580 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68  me checking to h
19590 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20 66  elp insure the f
195a0 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65  ile we opened re
195b0 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76  ally is.  ** a v
195c0 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66 69  alid database fi
195d0 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67  le. .  */.  nPag
195e0 65 20 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20  e = nPageHeader 
195f0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
19600 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19610 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
19620 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
19630 70 50 61 67 65 72 2c 20 28 69 6e 74 2a 29 26 6e  pPager, (int*)&n
19640 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28  PageFile);.  if(
19650 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d   nPage==0 || mem
19660 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67  cmp(24+(u8*)pPag
19670 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75  e1->aData, 92+(u
19680 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
19690 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50  ,4)!=0 ){.    nP
196a0 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b  age = nPageFile;
196b0 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42 74 2d  .  }.  if( (pBt-
196c0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
196d0 49 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73  ITE_ResetDatabas
196e0 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  e)!=0 ){.    nPa
196f0 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  ge = 0;.  }.  if
19700 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
19710 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
19720 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
19730 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
19740 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
19750 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
19760 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
19770 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19780 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
19790 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
197a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
197b0 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
197c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
197d0 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
197e0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
197f0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
19800 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
19810 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
19820 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
19830 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
19840 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
19850 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
19860 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
19870 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
19880 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
19890 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
198a0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
198b0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
198c0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
198d0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
198e0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
198f0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19900 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
19910 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
19920 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
19930 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
19940 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
19950 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
19960 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
19970 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
19980 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19990 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
199a0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
199b0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
199c0 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
199d0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
199e0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
199f0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
19a00 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
19a10 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
19a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a30 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
19a40 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
19a50 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
19a60 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
19a70 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
19a80 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
19a90 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
19aa0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
19ab0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
19ac0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
19ad0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
19ae0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
19af0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
19b00 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
19b10 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
19b20 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
19b30 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
19b40 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
19b50 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
19b60 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
19b70 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
19b80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
19b90 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
19ba0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
19bb0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
19bc0 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
19bd0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
19be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19bf0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
19c00 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
19c10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19c20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79      setDefaultSy
19c30 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49  ncFlag(pBt, SQLI
19c40 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
19c50 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20  YNCHRONOUS+1);. 
19c60 20 20 20 20 20 20 20 69 66 28 20 69 73 4f 70 65         if( isOpe
19c70 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
19c80 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65    releasePageOne
19c90 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
19ca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19cb0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  E_OK;.        }.
19cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
19cd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
19ce0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19cf0 20 20 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e     setDefaultSyn
19d00 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c 49 54  cFlag(pBt, SQLIT
19d10 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52  E_DEFAULT_SYNCHR
19d20 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20 7d 0a  ONOUS+1);.    }.
19d30 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45  #endif..    /* E
19d40 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35  VIDENCE-OF: R-15
19d50 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61  465-20813 The ma
19d60 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75  ximum and minimu
19d70 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f  m embedded paylo
19d80 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69  ad.    ** fracti
19d90 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66  ons and the leaf
19da0 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f   payload fractio
19db0 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  n values must be
19dc0 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e   64, 32, and 32.
19dd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19de0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69  he original desi
19df0 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65  gn allowed these
19e00 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79   amounts to vary
19e10 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20  , but as of.    
19e20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30  ** version 3.6.0
19e30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65  , we require the
19e40 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20  m to be fixed.. 
19e50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65     */.    if( me
19e60 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c  mcmp(&page1[21],
19e70 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c   "\100\040\040",
19e80 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  3)!=0 ){.      g
19e90 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
19ea0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
19eb0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19ec0 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54   R-51873-39618 T
19ed0 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72  he page size for
19ee0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
19ef0 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72   is.    ** deter
19f00 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62  mined by the 2-b
19f10 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61  yte integer loca
19f20 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  ted at an offset
19f30 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f   of 16 bytes fro
19f40 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67  m.    ** the beg
19f50 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
19f60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
19f70 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28      pageSize = (
19f80 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20  page1[16]<<8) | 
19f90 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b  (page1[17]<<16);
19fa0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
19fb0 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36  -OF: R-25008-216
19fc0 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61  88 The size of a
19fd0 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72   page is a power
19fe0 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62   of two.    ** b
19ff0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
1a000 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20  5536 inclusive. 
1a010 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67  */.    if( ((pag
1a020 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
1a030 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61  e)!=0.     || pa
1a040 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
1a050 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20  X_PAGE_SIZE .   
1a060 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32    || pageSize<=2
1a070 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  56 .    ){.     
1a080 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
1a090 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
1a0a0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1a0b0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
1a0c0 5f 46 49 58 45 44 3b 0a 20 20 20 20 61 73 73 65  _FIXED;.    asse
1a0d0 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
1a0e0 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a 20  7)==0 );.    /* 
1a0f0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
1a100 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20 22  9310-51205 The "
1a110 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22 20  reserved space" 
1a120 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62 79  size in the 1-by
1a130 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  te.    ** intege
1a140 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20 69  r at offset 20 i
1a150 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1a160 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
1a170 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20 20  t the end of.   
1a180 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74 6f   ** each page to
1a190 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78 74   reserve for ext
1a1a0 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a 2a  ensions. .    **
1a1b0 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45  .    ** EVIDENCE
1a1c0 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34  -OF: R-37497-424
1a1d0 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74  12 The size of t
1a1e0 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69  he reserved regi
1a1f0 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  on is.    ** det
1a200 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
1a210 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
1a220 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
1a230 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
1a240 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68  0.    ** into th
1a250 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a260 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 75  header. */.    u
1a270 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65  sableSize = page
1a280 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d  Size - page1[20]
1a290 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29 70  ;.    if( (u32)p
1a2a0 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61  ageSize!=pBt->pa
1a2b0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
1a2c0 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e 67  /* After reading
1a2d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
1a2e0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a2f0 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20  assuming a page 
1a300 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66  size.      ** of
1a310 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53 69   BtShared.pageSi
1a320 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73 63  ze, we have disc
1a330 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65 20  overed that the 
1a340 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20  page-size is.   
1a350 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70     ** actually p
1a360 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20  ageSize. Unlock 
1a370 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65  the database, le
1a380 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ave pBt->pPage1 
1a390 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  at.      ** zero
1a3a0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1a3b0 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65  TE_OK. The calle
1a3c0 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73  r will call this
1a3d0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
1a3e0 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74 68  ** again with th
1a3f0 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73  e correct page-s
1a400 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ize..      */.  
1a410 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1a420 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
1a430 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
1a440 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
1a450 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
1a460 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
1a470 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
1a480 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
1a490 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1a4a0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
1a4b0 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
1a4c0 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20  pageSize,.      
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
1a4f0 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65  eSize-usableSize
1a500 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a510 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
1a520 28 20 73 71 6c 69 74 65 33 57 72 69 74 61 62 6c  ( sqlite3Writabl
1a530 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 64 62 29  eSchema(pBt->db)
1a540 3d 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61  ==0 && nPage>nPa
1a550 67 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  geFile ){.      
1a560 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1a570 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1a580 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a590 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
1a5a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a5b0 3a 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20  : R-28312-64704 
1a5c0 48 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61  However, the usa
1a5d0 62 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20  ble size is not 
1a5e0 61 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a  allowed to.    *
1a5f0 2a 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  * be less than 4
1a600 38 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  80. In other wor
1a610 64 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  ds, if the page 
1a620 73 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65  size is 512, the
1a630 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73  n the.    ** res
1a640 65 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65  erved space size
1a650 20 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33   cannot exceed 3
1a660 32 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73  2. */.    if( us
1a670 61 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a  ableSize<480 ){.
1a680 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1a690 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1a6a0 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67    }.    pBt->pag
1a6b0 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
1a6c0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
1a6d0 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69  eSize = usableSi
1a6e0 7a 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ze;.#ifndef SQLI
1a6f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a700 55 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  UM.    pBt->auto
1a710 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
1a720 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34  te(&page1[36 + 4
1a730 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70  *4])?1:0);.    p
1a740 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d  Bt->incrVacuum =
1a750 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65   (get4byte(&page
1a760 31 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  1[36 + 7*4])?1:0
1a770 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
1a780 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20   /* maxLocal is 
1a790 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
1a7a0 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f  nt of payload to
1a7b0 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66   store locally f
1a7c0 6f 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20  or.  ** a cell. 
1a7d0 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73   Make sure it is
1a7e0 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f   small enough so
1a7f0 20 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d   that at least m
1a800 69 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65  inFanout.  ** ce
1a810 6c 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74  lls can will fit
1a820 20 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57   on one page.  W
1a830 65 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79  e assume a 10-by
1a840 74 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a  te page header..
1a850 20 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65    ** Besides the
1a860 20 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65   payload, the ce
1a870 6c 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20  ll must store:. 
1a880 20 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70   **     2-byte p
1a890 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65  ointer to the ce
1a8a0 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ll.  **     4-by
1a8b0 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
1a8c0 0a 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65  .  **     9-byte
1a8d0 20 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a   nKey value.  **
1a8e0 20 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74       4-byte nDat
1a8f0 61 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20  a value.  **    
1a900 20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77   4-byte overflow
1a910 20 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20   page pointer.  
1a920 2a 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e  ** So a cell con
1a930 73 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74  sists of a 2-byt
1a940 65 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61  e pointer, a hea
1a950 64 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20  der which is as 
1a960 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20  much as.  ** 17 
1a970 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f  bytes long, 0 to
1a980 20 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c   N bytes of payl
1a990 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69  oad, and an opti
1a9a0 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72  onal 4 byte over
1a9b0 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70  flow.  ** page p
1a9c0 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70  ointer..  */.  p
1a9d0 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28  Bt->maxLocal = (
1a9e0 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
1a9f0 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
1aa00 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 23);.  pBt->m
1aa10 69 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  inLocal = (u16)(
1aa20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
1aa30 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
1aa40 29 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61  );.  pBt->maxLea
1aa50 66 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  f = (u16)(pBt->u
1aa60 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b  sableSize - 35);
1aa70 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20  .  pBt->minLeaf 
1aa80 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73  = (u16)((pBt->us
1aa90 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f  ableSize-12)*32/
1aaa0 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28  255 - 23);.  if(
1aab0 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31   pBt->maxLocal>1
1aac0 32 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  27 ){.    pBt->m
1aad0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
1aae0 20 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   127;.  }else{. 
1aaf0 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
1ab00 50 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42  Payload = (u8)pB
1ab10 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d  t->maxLocal;.  }
1ab20 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1ab30 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20  maxLeaf + 23 <= 
1ab40 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
1ab50 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  ) );.  pBt->pPag
1ab60 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70  e1 = pPage1;.  p
1ab70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
1ab80 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
1ab90 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e  TE_OK;..page1_in
1aba0 69 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c  it_failed:.  rel
1abb0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1abc0 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67  e1);.  pBt->pPag
1abd0 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  e1 = 0;.  return
1abe0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1abf0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
1ac00 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1ac10 66 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f  f cursors open o
1ac20 6e 20 70 42 74 2e 20 54 68 69 73 20 69 73 20 66  n pBt. This is f
1ac30 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73  or use.** in ass
1ac40 65 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e  ert() expression
1ac50 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79  s, so it is only
1ac60 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45   compiled if NDE
1ac70 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65  BUG is not.** de
1ac80 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  fined..**.** Onl
1ac90 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  y write cursors 
1aca0 61 72 65 20 63 6f 75 6e 74 65 64 20 69 66 20 77  are counted if w
1acb0 72 4f 6e 6c 79 20 69 73 20 74 72 75 65 2e 20 20  rOnly is true.  
1acc0 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20  If wrOnly is.** 
1acd0 66 61 6c 73 65 20 74 68 65 6e 20 61 6c 6c 20 63  false then all c
1ace0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
1acf0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
1ad00 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
1ad10 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 63 75  is routine, a cu
1ad20 72 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73  rsor is any curs
1ad30 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61  or that.** is ca
1ad40 70 61 62 6c 65 20 6f 66 20 72 65 61 64 69 6e 67  pable of reading
1ad50 20 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20 74   or writing to t
1ad60 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 43 75  he database.  Cu
1ad70 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a 20 68 61  rsors that.** ha
1ad80 76 65 20 62 65 65 6e 20 74 72 69 70 70 65 64 20  ve been tripped 
1ad90 69 6e 74 6f 20 74 68 65 20 43 55 52 53 4f 52 5f  into the CURSOR_
1ada0 46 41 55 4c 54 20 73 74 61 74 65 20 61 72 65 20  FAULT state are 
1adb0 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a  not counted..*/.
1adc0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74  static int count
1add0 56 61 6c 69 64 43 75 72 73 6f 72 73 28 42 74 53  ValidCursors(BtS
1ade0 68 61 72 65 64 20 2a 70 42 74 2c 20 69 6e 74 20  hared *pBt, int 
1adf0 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  wrOnly){.  BtCur
1ae00 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74  sor *pCur;.  int
1ae10 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   r = 0;.  for(pC
1ae20 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  ur=pBt->pCursor;
1ae30 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72   pCur; pCur=pCur
1ae40 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1ae50 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  ( (wrOnly==0 || 
1ae60 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
1ae70 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
1ae80 29 21 3d 30 29 0a 20 20 20 20 20 26 26 20 70 43  )!=0).     && pC
1ae90 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
1aea0 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
1aeb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
1aec0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1aed0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
1aee0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72   outstanding cur
1aef0 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72 65 20  sors and we are 
1af00 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  not in the middl
1af10 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e 73 61  e.** of a transa
1af20 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72 65 20  ction but there 
1af30 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  is a read lock o
1af40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  n the database, 
1af50 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
1af60 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68 65 20  tine unrefs the 
1af70 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
1af80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1af90 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20 74 68  which .** has th
1afa0 65 20 65 66 66 65 63 74 20 6f 66 20 72 65 6c 65  e effect of rele
1afb0 61 73 69 6e 67 20 74 68 65 20 72 65 61 64 20 6c  asing the read l
1afc0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
1afd0 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61 63  ere is a transac
1afe0 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
1aff0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1b000 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1b010 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b  atic void unlock
1b020 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42 74  BtreeIfUnused(Bt
1b030 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
1b040 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b050 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1b060 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1b070 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  rt( countValidCu
1b080 72 73 6f 72 73 28 70 42 74 2c 30 29 3d 3d 30 20  rsors(pBt,0)==0 
1b090 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  || pBt->inTransa
1b0a0 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45  ction>TRANS_NONE
1b0b0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
1b0c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1b0d0 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d  ANS_NONE && pBt-
1b0e0 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
1b0f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b100 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b110 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1b120 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  ge1->aData );.  
1b130 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1b140 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1b150 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 31 20 29  Bt->pPager)==1 )
1b160 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67 65  ;.    pBt->pPage
1b170 31 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61  1 = 0;.    relea
1b180 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
1b190 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1b1a0 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
1b1b0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
1b1c0 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
1b1d0 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
1b1e0 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
1b1f0 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
1b200 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
1b210 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
1b220 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1b230 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
1b240 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
1b250 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
1b260 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
1b270 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
1b280 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
1b290 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1b2a0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
1b2b0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
1b2c0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
1b2d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b2e0 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
1b2f0 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
1b300 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
1b310 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
1b320 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
1b330 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
1b340 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
1b350 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1b360 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
1b370 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
1b380 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
1b390 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
1b3a0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
1b3b0 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
1b3c0 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
1b3d0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
1b3e0 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
1b3f0 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
1b400 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
1b410 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
1b420 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
1b430 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
1b440 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
1b450 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
1b460 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
1b470 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
1b480 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
1b490 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
1b4a0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
1b4b0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
1b4c0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
1b4d0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
1b4e0 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
1b4f0 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
1b500 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
1b510 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
1b520 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
1b530 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
1b540 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
1b550 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
1b560 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
1b570 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b580 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
1b590 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
1b5a0 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
1b5b0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
1b5c0 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
1b5d0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1b5e0 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
1b5f0 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
1b600 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
1b610 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1b620 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
1b630 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
1b640 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
1b650 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
1b660 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
1b670 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1b680 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1b690 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
1b6a0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1b6b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b6c0 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
1b6d0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
1b6e0 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
1b6f0 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
1b700 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
1b710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1b720 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
1b730 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
1b740 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
1b750 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
1b760 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
1b770 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
1b780 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
1b790 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
1b7a0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
1b7b0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
1b7c0 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
1b7d0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1b7e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1b7f0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1b800 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
1b810 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
1b820 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b830 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
1b840 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
1b850 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
1b860 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
1b870 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
1b880 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
1b890 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
1b8a0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
1b8b0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
1b8c0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
1b8d0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
1b8e0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
1b8f0 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
1b900 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
1b910 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
1b920 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
1b930 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
1b940 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
1b950 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
1b960 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
1b970 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
1b980 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
1b990 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
1b9a0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
1b9b0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
1b9c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
1b9d0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
1b9e0 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
1b9f0 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
1ba00 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1ba10 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
1ba20 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
1ba30 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
1ba40 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
1ba50 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
1ba60 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
1ba70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ba80 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
1ba90 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1baa0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
1bab0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
1bac0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
1bad0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1bae0 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
1baf0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1bb00 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
1bb10 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1bb20 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
1bb30 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
1bb40 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
1bb50 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
1bb60 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
1bb70 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
1bb80 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
1bb90 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
1bba0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
1bbb0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
1bbc0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
1bbd0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1bbe0 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
1bbf0 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
1bc00 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
1bc10 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
1bc20 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
1bc30 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
1bc40 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
1bc50 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1bc60 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
1bc70 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
1bc80 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
1bc90 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1bca0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
1bcb0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
1bcc0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
1bcd0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
1bce0 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
1bcf0 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
1bd00 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
1bd10 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
1bd20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
1bd30 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
1bd40 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1bd50 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
1bd60 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
1bd70 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1bd80 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
1bd90 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
1bda0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
1bdb0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
1bdc0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
1bdd0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
1bde0 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
1bdf0 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
1be00 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
1be10 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
1be20 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
1be30 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
1be40 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
1be50 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
1be60 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
1be70 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
1be80 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
1be90 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1bea0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
1beb0 69 6e 74 20 77 72 66 6c 61 67 2c 20 69 6e 74 20  int wrflag, int 
1bec0 2a 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e 29  *pSchemaVersion)
1bed0 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1bee0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
1bef0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1bf00 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
1bf10 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72  eEnter(p);.  btr
1bf20 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1bf30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
1bf40 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
1bf50 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
1bf60 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
1bf70 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1bf80 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1bf90 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
1bfa0 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
1bfb0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
1bfc0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1bfd0 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
1bfe0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1bff0 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
1c000 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
1c010 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
1c020 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1c030 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
1c040 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1c050 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1c060 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
1c070 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d  ->bDoTruncate)==
1c080 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 2d 3e  0 );..  if( (p->
1c090 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1c0a0 54 45 5f 52 65 73 65 74 44 61 74 61 62 61 73 65  TE_ResetDatabase
1c0b0 29 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  ) .   && sqlite3
1c0c0 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
1c0d0 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20  pBt->pPager)==0 
1c0e0 0a 20 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 62  .  ){.    pBt->b
1c0f0 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
1c100 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a  READ_ONLY;.  }..
1c110 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73    /* Write trans
1c120 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  actions are not 
1c130 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65  possible on a re
1c140 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
1c150 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e   */.  if( (pBt->
1c160 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52  btsFlags & BTS_R
1c170 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20  EAD_ONLY)!=0 && 
1c180 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
1c190 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
1c1a0 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
1c1b0 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23  ns_begun;.  }..#
1c1c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c1d0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1c1e0 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20    {.    sqlite3 
1c1f0 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20  *pBlock = 0;.   
1c200 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
1c210 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
1c220 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
1c230 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
1c240 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e  ction .    ** on
1c250 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72   this shared-btr
1c260 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ee structure and
1c270 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20   a second write 
1c280 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
1c290 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c     ** requested,
1c2a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1c2b0 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  OCKED..    */.  
1c2c0 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26    if( (wrflag &&
1c2d0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1c2e0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1c2f0 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e  ).     || (pBt->
1c300 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
1c310 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29  ENDING)!=0.    )
1c320 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d  {.      pBlock =
1c330 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
1c340 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  b;.    }else if(
1c350 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
1c360 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72     BtLock *pIter
1c370 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65  ;.      for(pIte
1c380 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1c390 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1c3a0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1c3b0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
1c3c0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
1c3d0 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
1c3e0 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
1c3f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c400 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c410 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c420 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20   pBlock ){.     
1c430 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1c440 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1c450 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20   pBlock);.      
1c460 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
1c470 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
1c480 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
1c490 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20  _begun;.    }.  
1c4a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  }.#endif..  /* A
1c4b0 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20  ny read-only or 
1c4c0 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73  read-write trans
1c4d0 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61  action implies a
1c4e0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20   read-lock on . 
1c4f0 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69   ** page 1. So i
1c500 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61  f some other sha
1c510 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74  red-cache client
1c520 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77   already has a w
1c530 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20  rite-lock .  ** 
1c540 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74  on page 1, the t
1c550 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f  ransaction canno
1c560 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a  t be opened. */.
1c570 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72    rc = queryShar
1c580 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
1c590 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  (p, MASTER_ROOT,
1c5a0 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69   READ_LOCK);.  i
1c5b0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
1c5c0 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65   ) goto trans_be
1c5d0 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73  gun;..  pBt->bts
1c5e0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e  Flags &= ~BTS_IN
1c5f0 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20  ITIALLY_EMPTY;. 
1c600 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
1c610 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  =0 ) pBt->btsFla
1c620 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41  gs |= BTS_INITIA
1c630 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20  LLY_EMPTY;.  do 
1c640 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f  {.    /* Call lo
1c650 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20  ckBtree() until 
1c660 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67  either pBt->pPag
1c670 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20  e1 is populated 
1c680 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74  or.    ** lockBt
1c690 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f  ree() returns so
1c6a0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1c6b0 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f  an SQLITE_OK. lo
1c6c0 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a  ckBtree().    **
1c6d0 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49   may return SQLI
1c6e0 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20  TE_OK but leave 
1c6f0 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20  pBt->pPage1 set 
1c700 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20  to 0 if after.  
1c710 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67    ** reading pag
1c720 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73  e 1 it discovers
1c730 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
1c740 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
1c750 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ase .    ** file
1c760 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67   is not pBt->pag
1c770 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63  eSize. In this c
1c780 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  ase lockBtree() 
1c790 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20  will update.    
1c7a0 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ** pBt->pageSize
1c7b0 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a   to the page-siz
1c7c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
1c7d0 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   disk..    */.  
1c7e0 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50    while( pBt->pP
1c7f0 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54  age1==0 && SQLIT
1c800 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b  E_OK==(rc = lock
1c810 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a  Btree(pBt)) );..
1c820 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1c830 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20  TE_OK && wrflag 
1c840 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42  ){.      if( (pB
1c850 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1c860 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1c870 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1c880 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
1c890 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c8a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c8b0 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74  e3PagerBegin(pBt
1c8c0 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e  ->pPager,wrflag>
1c8d0 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  1,sqlite3TempInM
1c8e0 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20  emory(p->db));. 
1c8f0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1c900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c910 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
1c920 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
1c930 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
1c940 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 5f 53  c==SQLITE_BUSY_S
1c950 4e 41 50 53 48 4f 54 20 26 26 20 70 42 74 2d 3e  NAPSHOT && pBt->
1c960 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1c970 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
1c980 20 20 20 20 20 20 20 2f 2a 20 69 66 20 74 68 65         /* if the
1c990 72 65 20 77 61 73 20 6e 6f 20 74 72 61 6e 73 61  re was no transa
1c9a0 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 77 68 65  ction opened whe
1c9b0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1c9c0 77 61 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  was.          **
1c9d0 20 63 61 6c 6c 65 64 20 61 6e 64 20 53 51 4c 49   called and SQLI
1c9e0 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1c9f0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 63 68   is returned, ch
1ca00 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 0a 20  ange the error. 
1ca10 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 64 65           ** code
1ca20 20 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   to SQLITE_BUSY.
1ca30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63   */.          rc
1ca40 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1ca50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca60 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
1ca70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ca80 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
1ca90 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
1caa0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
1cab0 6c 65 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53  le( (rc&0xFF)==S
1cac0 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 42  QLITE_BUSY && pB
1cad0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1cae0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a  ==TRANS_NONE &&.
1caf0 20 20 20 20 20 20 20 20 20 20 62 74 72 65 65 49            btreeI
1cb00 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
1cb10 28 70 42 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  (pBt) );.  sqlit
1cb20 65 33 50 61 67 65 72 52 65 73 65 74 4c 6f 63 6b  e3PagerResetLock
1cb30 54 69 6d 65 6f 75 74 28 70 42 74 2d 3e 70 50 61  Timeout(pBt->pPa
1cb40 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ger);..  if( rc=
1cb50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb60 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1cb70 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  ==TRANS_NONE ){.
1cb80 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1cb90 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64  saction++;.#ifnd
1cba0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1cbb0 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20  HARED_CACHE.    
1cbc0 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
1cbd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
1cbe0 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74  ert( p->lock.pBt
1cbf0 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63  ree==p && p->loc
1cc00 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20  k.iTable==1 );. 
1cc10 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65         p->lock.e
1cc20 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b  Lock = READ_LOCK
1cc30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63  ;.        p->loc
1cc40 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  k.pNext = pBt->p
1cc50 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42  Lock;.        pB
1cc60 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c  t->pLock = &p->l
1cc70 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ock;.      }.#en
1cc80 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  dif.    }.    p-
1cc90 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c  >inTrans = (wrfl
1cca0 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54  ag?TRANS_WRITE:T
1ccb0 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20  RANS_READ);.    
1ccc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70  if( p->inTrans>p
1ccd0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1cce0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
1ccf0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
1cd00 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20  p->inTrans;.    
1cd10 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  }.    if( wrflag
1cd20 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
1cd30 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1cd40 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66  >pPage1;.#ifndef
1cd50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1cd60 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20  RED_CACHE.      
1cd70 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57  assert( !pBt->pW
1cd80 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70  riter );.      p
1cd90 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b  Bt->pWriter = p;
1cda0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
1cdb0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43  lags &= ~BTS_EXC
1cdc0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66  LUSIVE;.      if
1cdd0 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74  ( wrflag>1 ) pBt
1cde0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1cdf0 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e  S_EXCLUSIVE;.#en
1ce00 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66  dif..      /* If
1ce10 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61   the db-size hea
1ce20 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63  der field is inc
1ce30 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61  orrect (as it ma
1ce40 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20  y be if an old. 
1ce50 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68       ** client h
1ce60 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20  as been writing 
1ce70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1ce80 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f  e), update it no
1ce90 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a  w. Doing.      *
1cea0 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61  * this sooner ra
1ceb0 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20  ther than later 
1cec0 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1ced0 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65  se size can safe
1cee0 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d  ly .      ** re-
1cef0 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  read the databas
1cf00 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65  e size from page
1cf10 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e   1 if a savepoin
1cf20 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
1cf30 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61  .      ** rollba
1cf40 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  ck occurs within
1cf50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cf60 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1cf70 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21   if( pBt->nPage!
1cf80 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65  =get4byte(&pPage
1cf90 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b  1->aData[28]) ){
1cfa0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1cfb0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1cfc0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1cfd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1cfe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1cff0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1d000 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1d010 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65  [28], pBt->nPage
1d020 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d030 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d040 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1d050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d060 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 63 68   ){.    if( pSch
1d070 65 6d 61 56 65 72 73 69 6f 6e 20 29 7b 0a 20 20  emaVersion ){.  
1d080 20 20 20 20 2a 70 53 63 68 65 6d 61 56 65 72 73      *pSchemaVers
1d090 69 6f 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26  ion = get4byte(&
1d0a0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1d0b0 74 61 5b 34 30 5d 29 3b 0a 20 20 20 20 7d 0a 20  ta[40]);.    }. 
1d0c0 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 7b     if( wrflag ){
1d0d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
1d0e0 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65 20 74  all makes sure t
1d0f0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 68 61  hat the pager ha
1d100 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75  s the correct nu
1d110 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 2a 2a  mber of.      **
1d120 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1d130 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1d140 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1d150 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1d160 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62        ** the sub
1d170 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1d180 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1d190 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1d1a0 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 20  ened here..     
1d1b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
1d1c0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
1d1d0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
1d1e0 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61  ager, p->db->nSa
1d1f0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a  vepoint);.    }.
1d200 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1d210 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
1d220 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
1d230 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d240 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1d250 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1d260 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1d270 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
1d280 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c  ies for all chil
1d290 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61  dren of page pPa
1d2a0 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20  ge. Also, if.** 
1d2b0 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63  pPage contains c
1d2c0 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20  ells that point 
1d2d0 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1d2e0 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74  s, set the point
1d2f0 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65  er.** map entrie
1d300 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  s for the overfl
1d310 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c  ow pages as well
1d320 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d330 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
1d340 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
1d350 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
1d360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d370 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72        /* Counter
1d380 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69   variable */.  i
1d390 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
1d3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
1d3c0 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61  ells in page pPa
1d3d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
1d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d400 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42  turn code */.  B
1d410 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1d420 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
1d430 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
1d440 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
1d450 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d460 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1d470 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1d480 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f   pPage->isInit ?
1d490 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72   SQLITE_OK : btr
1d4a0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1d4b0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1d4c0 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1d4d0 72 63 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50  rc;.  nCell = pP
1d4e0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66  age->nCell;..  f
1d4f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b  or(i=0; i<nCell;
1d500 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70   i++){.    u8 *p
1d510 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1d520 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20  pPage, i);..    
1d530 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
1d540 28 70 50 61 67 65 2c 20 70 50 61 67 65 2c 20 70  (pPage, pPage, p
1d550 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20  Cell, &rc);..   
1d560 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1d570 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
1d580 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1d590 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
1d5a0 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1d5b0 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1d5c0 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1d5d0 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   &rc);.    }.  }
1d5e0 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
1d5f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1d600 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74   childPgno = get
1d610 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1d620 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1d630 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74  fset+8]);.    pt
1d640 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
1d650 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
1d660 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29  TREE, pgno, &rc)
1d670 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1d680 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
1d690 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 20  ewhere on pPage 
1d6a0 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
1d6b0 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f 64  page iFrom.  Mod
1d6c0 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
1d6d0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 70   so.** that it p
1d6e0 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50 61  oints to iTo. Pa
1d6f0 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
1d700 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
1d710 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a   of pointer to.*
1d720 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61  * be modified, a
1d730 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  s  follows:.**.*
1d740 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
1d750 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
1d760 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
1d770 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1d780 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
1d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1d7a0 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
1d7b0 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1d7c0 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
1d7d0 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d7e0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d7f0 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
1d800 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d810 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
1d820 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
1d830 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
1d840 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1d850 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
1d860 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
1d870 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1d880 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
1d890 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
1d8a0 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
1d8b0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
1d8c0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
1d8d0 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
1d8e0 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
1d8f0 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
1d900 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
1d910 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
1d920 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d930 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1d940 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1d950 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
1d960 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
1d970 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
1d980 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
1d990 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
1d9a0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
1d9b0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
1d9c0 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
1d9d0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
1d9e0 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
1d9f0 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
1da00 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
1da10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1da20 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1da30 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
1da40 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
1da50 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
1da60 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
1da70 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1da80 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1da90 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 50 61  c;..    rc = pPa
1daa0 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c  ge->isInit ? SQL
1dab0 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e  ITE_OK : btreeIn
1dac0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1dad0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1dae0 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c 6c  rn rc;.    nCell
1daf0 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1db00 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
1db10 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
1db20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1db30 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1db40 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  i);.      if( eT
1db50 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1db60 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20  FLOW1 ){.       
1db70 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
1db80 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78          pPage->x
1db90 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
1dba0 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
1dbb0 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f          if( info
1dbc0 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61  .nLocal<info.nPa
1dbd0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
1dbe0 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69 6e 66     if( pCell+inf
1dbf0 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67 65 2d  o.nSize > pPage-
1dc00 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 70 42  >aData+pPage->pB
1dc10 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
1dc20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1dc30 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1dc40 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
1dc50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1dc60 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
1dc70 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b  =get4byte(pCell+
1dc80 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20 29 7b  info.nSize-4) ){
1dc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1dca0 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f  4byte(pCell+info
1dcb0 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a  .nSize-4, iTo);.
1dcc0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1dcd0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1dce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dcf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1dd00 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1dd10 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1dd20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1dd30 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1dd40 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1dd50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1dd60 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1dd70 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1dd80 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1dd90 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1dda0 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1ddb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1ddc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1ddd0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1dde0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ddf0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
1de00 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  (pPage);.      }
1de10 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1de20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1de30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1de40 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 20  ], iTo);.    }. 
1de50 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1de60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1de70 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20 64   Move the open d
1de80 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1de90 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Page to location
1dea0 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74 68   iFreePage in th
1deb0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  e .** database. 
1dec0 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66 65  The pDbPage refe
1ded0 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76 61  rence remains va
1dee0 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  lid..**.** The i
1def0 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e 64  sCommit flag ind
1df00 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 72  icates that ther
1df10 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
1df20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a 2a  remember that.**
1df30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65   the journal nee
1df40 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65  ds to be sync()e
1df50 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61 73  d before databas
1df60 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d 3e  e page pDbPage->
1df70 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65 20  pgno .** can be 
1df80 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65 20  written to. The 
1df90 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1dfa0 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74 20  dy promised not 
1dfb0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61 74  to write to that
1dfc0 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  .** page..*/.sta
1dfd0 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74 65  tic int relocate
1dfe0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1dff0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
1e000 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d   /* Btree */.  M
1e010 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65 2c  emPage *pDbPage,
1e020 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
1e030 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a  page to move */.
1e040 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20 20    u8 eType,     
1e050 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1e060 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65 27  inter map 'type'
1e070 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61   entry for pDbPa
1e080 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ge */.  Pgno iPt
1e090 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  rPage,          
1e0a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1e0b0 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20  'page-no' entry 
1e0c0 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1e0d0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 2c   Pgno iFreePage,
1e0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e0f0 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76   location to mov
1e100 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a  e pDbPage to */.
1e110 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20 20    int isCommit  
1e120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73             /* is
1e130 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73 73  Commit flag pass
1e140 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ed to sqlite3Pag
1e150 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29 7b  erMovepage */.){
1e160 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72  .  MemPage *pPtr
1e170 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70  Page;   /* The p
1e180 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
1e190 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
1e1a0 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1e1b0 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61   iDbPage = pDbPa
1e1c0 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65  ge->pgno;.  Page
1e1d0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d  r *pPager = pBt-
1e1e0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1e1f0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54  c;..  assert( eT
1e200 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
1e210 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d  FLOW2 || eType==
1e220 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1e230 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65   || .      eType
1e240 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
1e250 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1e260 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73  ROOTPAGE );.  as
1e270 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e280 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1e290 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1e2a0 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d  ( pDbPage->pBt==
1e2b0 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69 44 62  pBt );.  if( iDb
1e2c0 50 61 67 65 3c 33 20 29 20 72 65 74 75 72 6e 20  Page<3 ) return 
1e2d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e2e0 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  KPT;..  /* Move 
1e2f0 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f  page iDbPage fro
1e300 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f  m its current lo
1e310 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e  cation to page n
1e320 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20  umber iFreePage 
1e330 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54  */.  TRACE(("AUT
1e340 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20  OVACUUM: Moving 
1e350 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20  %d to free page 
1e360 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20  %d (ptr page %d 
1e370 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20  type %d)\n", .  
1e380 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72      iDbPage, iFr
1e390 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65  eePage, iPtrPage
1e3a0 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20  , eType));.  rc 
1e3b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  = sqlite3PagerMo
1e3c0 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  vepage(pPager, p
1e3d0 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c  DbPage->pDbPage,
1e3e0 20 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f   iFreePage, isCo
1e3f0 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21  mmit);.  if( rc!
1e400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e410 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e420 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f  .  pDbPage->pgno
1e430 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20   = iFreePage;.. 
1e440 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77   /* If pDbPage w
1e450 61 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c  as a btree-page,
1e460 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76   then it may hav
1e470 65 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e  e child pages an
1e480 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  d/or cells.  ** 
1e490 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76  that point to ov
1e4a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68  erflow pages. Th
1e4b0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
1e4c0 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68  tries for all th
1e4d0 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e  ese.  ** pages n
1e4e0 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65  eed to be change
1e4f0 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  d..  **.  ** If 
1e500 70 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76  pDbPage is an ov
1e510 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
1e520 6e 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  n the first 4 by
1e530 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a  tes may store a.
1e540 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20    ** pointer to 
1e550 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  a subsequent ove
1e560 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74  rflow page. If t
1e570 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
1e580 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70   then.  ** the p
1e590 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73  ointer map needs
1e5a0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66   to be updated f
1e5b0 6f 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e  or the subsequen
1e5c0 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1e5d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1e5e0 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1e5f0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1e600 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20  _ROOTPAGE ){.   
1e610 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74   rc = setChildPt
1e620 72 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a  rmaps(pDbPage);.
1e630 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1e640 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1e650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e660 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1e670 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74  o nextOvfl = get
1e680 34 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61  4byte(pDbPage->a
1e690 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e  Data);.    if( n
1e6a0 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20  extOvfl!=0 ){.  
1e6b0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1e6c0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
1e6d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
1e6e0 46 72 65 65 50 61 67 65 2c 20 26 72 63 29 3b 0a  FreePage, &rc);.
1e6f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e700 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e710 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e720 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1e730 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61  .  /* Fix the da
1e740 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f  tabase pointer o
1e750 6e 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20  n page iPtrPage 
1e760 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20  that pointed at 
1e770 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20  iDbPage so.  ** 
1e780 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61  that it points a
1e790 74 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73  t iFreePage. Als
1e7a0 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65  o fix the pointe
1e7b0 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a  r map entry for.
1e7c0 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20    ** iPtrPage.. 
1e7d0 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21   */.  if( eType!
1e7e0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1e7f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
1e800 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
1e810 50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61  PtrPage, &pPtrPa
1e820 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
1e830 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e840 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e850 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1e860 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e870 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62  te(pPtrPage->pDb
1e880 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1e890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e8a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1e8b0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1e8c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1e8d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64    }.    rc = mod
1e8e0 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70  ifyPagePointer(p
1e8f0 50 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65  PtrPage, iDbPage
1e900 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
1e910 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  pe);.    release
1e920 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1e930 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e950 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 46  trmapPut(pBt, iF
1e960 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 2c 20  reePage, eType, 
1e970 69 50 74 72 50 61 67 65 2c 20 26 72 63 29 3b 0a  iPtrPage, &rc);.
1e980 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e990 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1e9a0 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
1e9b0 20 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63   required by inc
1e9c0 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a  rVacuumStep(). *
1e9d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
1e9e0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42  ocateBtreePage(B
1e9f0 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61  tShared *, MemPa
1ea00 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50  ge **, Pgno *, P
1ea10 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a  gno, u8);../*.**
1ea20 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c   Perform a singl
1ea30 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63  e step of an inc
1ea40 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e  remental-vacuum.
1ea50 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1ea60 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
1ea70 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73  _OK. If there is
1ea80 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28   no work to do (
1ea90 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  and therefore no
1eaa0 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61   point in .** ca
1eab0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1eac0 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75  ion again), retu
1ead0 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20  rn SQLITE_DONE. 
1eae0 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  Or, if an error 
1eaf0 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65 74 75  .** occurs, retu
1eb00 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  rn some other er
1eb10 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ror code..**.** 
1eb20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61 6c 6c  More specificall
1eb30 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
1eb40 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
1eb50 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64 61 74  organize the dat
1eb60 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61  abase so .** tha
1eb70 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
1eb80 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
1eb90 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69 73 20  ently in use is 
1eba0 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65  no longer in use
1ebb0 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
1ebc0 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20 6e 75  r nFin is the nu
1ebd0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
1ebe0 61 74 20 74 68 69 73 20 64 61 74 61 62 61 73 65  at this database
1ebf0 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a   would contain.*
1ec00 2a 20 77 65 72 65 20 74 68 69 73 20 66 75 6e 63  * were this func
1ec10 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69  tion called unti
1ec20 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  l it returns SQL
1ec30 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20  ITE_DONE..**.** 
1ec40 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74 20 70  If the bCommit p
1ec50 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
1ec60 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e 63 74  zero, this funct
1ec70 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1ec80 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20   the .** caller 
1ec90 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e  will keep callin
1eca0 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  g incrVacuumStep
1ecb0 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75  () until it retu
1ecc0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
1ecd0 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e  .** or an error.
1ece0 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61 73 73   bCommit is pass
1ecf0 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e 20 61  ed true for an a
1ed00 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f  uto-vacuum-on-co
1ed10 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69  mmit .** operati
1ed20 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66 6f 72  on, or false for
1ed30 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
1ed40 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  vacuum..*/.stati
1ed50 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
1ed60 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
1ed70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
1ed80 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69 6e 74  gno iLastPg, int
1ed90 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e   bCommit){.  Pgn
1eda0 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
1edb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1edc0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
1edd0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1ede0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
1edf0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1ee00 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1ee10 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1ee20 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e 46 69  ert( iLastPg>nFi
1ee30 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  n );..  if( !PTR
1ee40 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
1ee50 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
1ee60 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
1ee70 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1ee80 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20     u8 eType;.   
1ee90 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a   Pgno iPtrPage;.
1eea0 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d  .    nFreeList =
1eeb0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1eec0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1eed0 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65  ]);.    if( nFre
1eee0 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  eList==0 ){.    
1eef0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ef00 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
1ef10 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1ef20 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
1ef30 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
1ef40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ef50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ef60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ef70 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
1ef80 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
1ef90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1efa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1efb0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1efc0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1efd0 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
1efe0 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1eff0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
1f000 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
1f010 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 73  e from the files
1f020 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 69 73   free-list. This
1f030 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
1f040 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 62  .        ** if b
1f050 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65  Commit is non-ze
1f060 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  ro. In that case
1f070 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  , the free-list 
1f080 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20  will be.        
1f090 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  ** truncated to 
1f0a0 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20  zero after this 
1f0b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
1f0c0 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1f0d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74  .        ** matt
1f0e0 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63  er if it still c
1f0f0 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72  ontains some gar
1f100 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20  bage entries..  
1f110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1f120 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20   Pgno iFreePg;. 
1f130 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
1f140 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  pFreePg;.       
1f150 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
1f160 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46  reePage(pBt, &pF
1f170 72 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c  reePg, &iFreePg,
1f180 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f   iLastPg, BTALLO
1f190 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20 20 20  C_EXACT);.      
1f1a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f1b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f1c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f1d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
1f1e0 73 65 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69  sert( iFreePg==i
1f1f0 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20  LastPg );.      
1f200 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
1f210 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
1f220 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1f230 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1f240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f250 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20 70 61  Index of free pa
1f260 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74  ge to move pLast
1f270 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d  Pg to */.      M
1f280 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b  emPage *pLastPg;
1f290 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64 65 20  .      u8 eMode 
1f2a0 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20  = BTALLOC_ANY;  
1f2b0 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d 65 74   /* Mode paramet
1f2c0 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42  er for allocateB
1f2d0 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 20 20  treePage() */.  
1f2e0 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d      Pgno iNear =
1f2f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
1f300 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65 74 65   nearby paramete
1f310 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74  r for allocateBt
1f320 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20  reePage() */..  
1f330 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1f340 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74  tPage(pBt, iLast
1f350 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29  Pg, &pLastPg, 0)
1f360 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1f370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f380 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f390 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f3a0 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * If bCommit is 
1f3b0 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20  zero, this loop 
1f3c0 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e 63  runs exactly onc
1f3d0 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73 74  e and page pLast
1f3e0 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73  Pg.      ** is s
1f3f0 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65 20  wapped with the 
1f400 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1f410 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20 66  pulled off the f
1f420 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20 20  ree list..      
1f430 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74  **.      ** On t
1f440 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69  he other hand, i
1f450 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67 72 65  f bCommit is gre
1f460 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
1f470 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
1f480 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
1f490 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
1f4a0 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
1f4b0 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
1f4c0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
1f4d0 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
1f4e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1f4f0 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b  f( bCommit==0 ){
1f500 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65 20 3d  .        eMode =
1f510 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20   BTALLOC_LE;.   
1f520 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e 46 69       iNear = nFi
1f530 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
1f540 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
1f550 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
1f560 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
1f570 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
1f580 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
1f590 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c 20 65  FreePg, iNear, e
1f5a0 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Mode);.        i
1f5b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f5c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1f5d0 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1f5e0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  g);.          re
1f5f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1f600 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61   }.        relea
1f610 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
1f620 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 62  .      }while( b
1f630 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65 65 50  Commit && iFreeP
1f640 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20  g>nFin );.      
1f650 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3c  assert( iFreePg<
1f660 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20  iLastPg );.     
1f670 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c   .      rc = rel
1f680 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
1f690 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20 69  LastPg, eType, i
1f6a0 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50 67  PtrPage, iFreePg
1f6b0 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  , bCommit);.    
1f6c0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
1f6d0 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
1f6e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f6f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f700 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f710 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62    }.  }..  if( b
1f720 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f730 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c 61 73   do {.      iLas
1f740 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c  tPg--;.    }whil
1f750 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44  e( iLastPg==PEND
1f760 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f770 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50  t) || PTRMAP_ISP
1f780 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67  AGE(pBt, iLastPg
1f790 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44  ) );.    pBt->bD
1f7a0 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20  oTruncate = 1;. 
1f7b0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1f7c0 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72  iLastPg;.  }.  r
1f7d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f7e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61  .}../*.** The da
1f7f0 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79  tabase opened by
1f800 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1f810 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f 2d 76  ent is an auto-v
1f820 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 0a 2a  acuum database.*
1f830 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20 69 6e  * nOrig pages in
1f840 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67   size containing
1f850 20 6e 46 72 65 65 20 66 72 65 65 20 70 61 67 65   nFree free page
1f860 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 65 78  s. Return the ex
1f870 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20  pected .** size 
1f880 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f890 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69  in pages followi
1f8a0 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  ng an auto-vacuu
1f8b0 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  m operation..*/.
1f8c0 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69 6e 61  static Pgno fina
1f8d0 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72 65 64  lDbSize(BtShared
1f8e0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69   *pBt, Pgno nOri
1f8f0 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a  g, Pgno nFree){.
1f900 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20    int nEntry;   
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f930 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74  ntries on one pt
1f940 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 50  rmap page */.  P
1f950 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20 20 20  gno nPtrmap;    
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74 72 4d  * Number of PtrM
1f980 61 70 20 70 61 67 65 73 20 74 6f 20 62 65 20 66  ap pages to be f
1f990 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  reed */.  Pgno n
1f9a0 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  Fin;            
1f9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1f9c0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20  urn value */..  
1f9d0 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e 75 73  nEntry = pBt->us
1f9e0 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50  ableSize/5;.  nP
1f9f0 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e  trmap = (nFree-n
1fa00 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41 47 45  Orig+PTRMAP_PAGE
1fa10 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e  NO(pBt, nOrig)+n
1fa20 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20  Entry)/nEntry;. 
1fa30 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
1fa40 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
1fa50 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e  .  if( nOrig>PEN
1fa60 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1fa70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44  Bt) && nFin<PEND
1fa80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fa90 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1faa0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50  ;.  }.  while( P
1fab0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1fac0 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d  , nFin) || nFin=
1fad0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fae0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1faf0 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65  Fin--;.  }..  re
1fb00 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a  turn nFin;.}../*
1fb10 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1fb20 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1fb30 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20 63 61  opened before ca
1fb40 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1fb50 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f  ion..** It perfo
1fb60 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75 6e 69  rms a single uni
1fb70 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61 72 64  t of work toward
1fb80 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  s an incremental
1fb90 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49   vacuum..**.** I
1fba0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1fbb0 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69 6e 69  l vacuum is fini
1fbc0 73 68 65 64 20 61 66 74 65 72 20 74 68 69 73 20  shed after this 
1fbd0 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72 75 6e  function has run
1fbe0 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ,.** SQLITE_DONE
1fbf0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1fc00 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e 69 73   it is not finis
1fc10 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f  hed, but no erro
1fc20 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53  r occurred,.** S
1fc30 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1fc40 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
1fc50 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
1fc60 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71  code. .*/.int sq
1fc70 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72 56 61  lite3BtreeIncrVa
1fc80 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a  cuum(Btree *p){.
1fc90 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
1fca0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1fcb0 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  Bt;..  sqlite3Bt
1fcc0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
1fcd0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1fce0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1fcf0 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54  _WRITE && p->inT
1fd00 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1fd10 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  E );.  if( !pBt-
1fd20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
1fd30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
1fd40 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ONE;.  }else{.  
1fd50 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62    Pgno nOrig = b
1fd60 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
1fd70 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72  t);.    Pgno nFr
1fd80 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
1fd90 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1fda0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f  a[36]);.    Pgno
1fdb0 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1fdc0 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1fdd0 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69 66 28  nFree);..    if(
1fde0 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20   nOrig<nFin ){. 
1fdf0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fe00 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1fe10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 72     }else if( nFr
1fe20 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ee>0 ){.      rc
1fe30 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
1fe40 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
1fe50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fe60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fe70 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76   invalidateAllOv
1fe80 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29  erflowCache(pBt)
1fe90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 69  ;.        rc = i
1fea0 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
1feb0 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20  t, nFin, nOrig, 
1fec0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1fed0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1fef0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ff00 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
1ff10 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1ff20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
1ff30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
1ff40 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1ff50 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ff60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1ff70 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1ff80 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
1ff90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1ffa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ffb0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1ffc0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72  ine is called pr
1ffd0 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61  ior to sqlite3Pa
1ffe0 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61  gerCommit when a
1fff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
20000 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72  is committed for
20010 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
20020 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
20030 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  If SQLITE_OK is 
20040 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a  returned, then *
20050 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74 20 74  pnTrunc is set t
20060 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
20070 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74  pages.** the dat
20080 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c  abase file shoul
20090 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  d be truncated t
200a0 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  o during the com
200b0 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a  mit process. .**
200c0 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61   i.e. the databa
200d0 73 65 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72  se has been reor
200e0 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20  ganized so that 
200f0 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a  only the first *
20100 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73  pnTrunc.** pages
20110 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a   are in use..*/.
20120 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56  static int autoV
20130 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68  acuumCommit(BtSh
20140 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
20150 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
20160 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
20170 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b  r = pBt->pPager;
20180 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74  .  VVA_ONLY( int
20190 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
201a0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
201b0 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73 65 72  ger); )..  asser
201c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
201d0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
201e0 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
201f0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
20200 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
20210 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
20220 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
20230 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
20240 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20   Pgno nFin;     
20250 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
20260 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
20270 73 65 20 61 66 74 65 72 20 61 75 74 6f 76 61 63  se after autovac
20280 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67  uuming */.    Pg
20290 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  no nFree;       
202a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
202b0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
202c0 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f  ist initially */
202d0 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 3b  .    Pgno iFree;
202e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
202f0 65 78 74 20 70 61 67 65 20 74 6f 20 62 65 20 66  ext page to be f
20300 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  reed */.    Pgno
20310 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 2f   nOrig;        /
20320 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a 65 20  * Database size 
20330 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 20 2a  before freeing *
20340 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d 20 62  /..    nOrig = b
20350 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
20360 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54 52 4d  t);.    if( PTRM
20370 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
20380 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d  Orig) || nOrig==
20390 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
203a0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
203b0 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  /* It is not pos
203c0 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  sible to create 
203d0 61 20 64 61 74 61 62 61 73 65 20 66 6f 72 20 77  a database for w
203e0 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c 20 70  hich the final p
203f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
20400 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
20410 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74 68 65  -map page or the
20420 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
20430 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20 20 20  ge. If one.     
20440 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74 65 72   ** is encounter
20450 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74  ed, this indicat
20460 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  es corruption.. 
20470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
20480 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
20490 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
204a0 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
204b0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
204c0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
204d0 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c      nFin = final
204e0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
204f0 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 69  g, nFree);.    i
20500 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20  f( nFin>nOrig ) 
20510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20520 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20530 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29  if( nFin<nOrig )
20540 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76  {.      rc = sav
20550 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
20560 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
20570 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69    for(iFree=nOri
20580 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20 26 26  g; iFree>nFin &&
20590 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
205a0 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20  iFree--){.      
205b0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
205c0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69  tep(pBt, nFin, i
205d0 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  Free, 1);.    }.
205e0 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c      if( (rc==SQL
205f0 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d  ITE_DONE || rc==
20600 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46  SQLITE_OK) && nF
20610 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  ree>0 ){.      r
20620 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20630 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
20640 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
20650 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
20660 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20670 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  32], 0);.      p
20680 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
20690 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
206a0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
206b0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
206c0 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69  ->aData[28], nFi
206d0 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  n);.      pBt->b
206e0 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a  DoTruncate = 1;.
206f0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
20700 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20   = nFin;.    }. 
20710 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20720 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
20730 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20740 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
20750 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20760 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33 50 61   nRef>=sqlite3Pa
20770 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
20780 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  er) );.  return 
20790 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  rc;.}..#else /* 
207a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
207b0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
207c0 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43 68 69  .# define setChi
207d0 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53 51 4c  ldPtrmaps(x) SQL
207e0 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f  ITE_OK.#endif../
207f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
20800 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
20810 20 70 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d   phase of a two-
20820 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
20830 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63  his routine.** c
20840 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b  auses a rollback
20850 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63   journal to be c
20860 72 65 61 74 65 64 20 28 69 66 20 69 74 20 64 6f  reated (if it do
20870 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65  es not already e
20880 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70  xist).** and pop
20890 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75  ulated with enou
208a0 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73  gh information s
208b0 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f 77 65  o that if a powe
208c0 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a  r loss occurs.**
208d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
208e0 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  n be restored to
208f0 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
20900 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62  ate by playing b
20910 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ack.** the journ
20920 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f  al.  Then the co
20930 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f  ntents of the jo
20940 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65  urnal are flushe
20950 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20  d out to.** the 
20960 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65  disk.  After the
20970 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65   journal is safe
20980 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65  ly on oxide, the
20990 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a   changes to the.
209a0 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72 65 20  ** database are 
209b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
209c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
209d0 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78  nd flushed to ox
209e0 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ide..** At the e
209f0 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c  nd of this call,
20a00 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
20a10 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73  urnal still exis
20a20 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73  ts on the.** dis
20a30 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73 74 69  k and we are sti
20a40 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c  ll holding all l
20a50 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61  ocks, so the tra
20a60 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74  nsaction has not
20a70 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20  .** committed.  
20a80 53 65 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  See sqlite3Btree
20a90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
20aa0 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64 20   for the second 
20ab0 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20  phase of the.** 
20ac0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a  commit process..
20ad0 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20  **.** This call 
20ae0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f  is a no-op if no
20af0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
20b00 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  on is currently 
20b10 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a  active on pBt..*
20b20 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
20b30 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  sync the databas
20b40 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 62  e file for the b
20b50 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74 65  tree pBt. zMaste
20b60 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  r points to.** t
20b70 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
20b80 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20b90 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
20ba0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
20bb0 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20 6a  .** individual j
20bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20  ournal file, or 
20bd0 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74  is NULL, indicat
20be0 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  ing no master jo
20bf0 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28  urnal file .** (
20c00 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
20c10 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
20c20 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
20c30 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73   called, the mas
20c40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75  ter journal shou
20c50 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  ld already have 
20c60 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c  been.** created,
20c70 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
20c80 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  this journal poi
20c90 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64 20  nter and synced 
20ca0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f  to disk..**.** O
20cb0 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75 74  nce this is rout
20cc0 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65 64  ine has returned
20cd0 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  , the only thing
20ce0 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f 6d   required to com
20cf0 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74 65  mit.** the write
20d00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72  -transaction for
20d10 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 66   this database f
20d20 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ile is to delete
20d30 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f   the journal..*/
20d40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
20d50 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
20d60 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20  Btree *p, const 
20d70 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
20d80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20d90 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69  E_OK;.  if( p->i
20da0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
20db0 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61  ITE ){.    BtSha
20dc0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
20dd0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
20de0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23 69 66  reeEnter(p);.#if
20df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20e00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20e10 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20e20 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
20e30 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
20e40 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69  it(pBt);.      i
20e50 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20e60 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
20e70 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
20e80 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20e90 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
20ea0 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
20eb0 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b 0a 20  bDoTruncate ){. 
20ec0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
20ed0 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70  rTruncateImage(p
20ee0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42 74 2d  Bt->pPager, pBt-
20ef0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  >nPage);.    }.#
20f00 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73  endif.    rc = s
20f10 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
20f20 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70  tPhaseOne(pBt->p
20f30 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20  Pager, zMaster, 
20f40 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  0);.    sqlite3B
20f50 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
20f60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20f70 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20f80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20f90 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65 65 43  from both BtreeC
20fa0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
20fb0 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62 61 63  and BtreeRollbac
20fc0 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f  k().** at the co
20fd0 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20 74 72  nclusion of a tr
20fe0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
20ff0 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 45  atic void btreeE
21000 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 42 74  ndTransaction(Bt
21010 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
21020 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
21030 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
21040 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
21050 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21060 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b  HoldsMutex(p) );
21070 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21080 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21090 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  .  pBt->bDoTrunc
210a0 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ate = 0;.#endif.
210b0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
210c0 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64  >TRANS_NONE && d
210d0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31 20 29  b->nVdbeRead>1 )
210e0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
210f0 65 20 61 72 65 20 6f 74 68 65 72 20 61 63 74 69  e are other acti
21100 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ve statements th
21110 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69  at belong to thi
21120 73 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  s database.    *
21130 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72  * handle, downgr
21140 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e  ade to a read-on
21150 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ly transaction. 
21160 54 68 65 20 6f 74 68 65 72 20 73 74 61 74 65 6d  The other statem
21170 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  ents.    ** may 
21180 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
21190 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
211a0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e  se.  */.    down
211b0 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
211c0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
211d0 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  ;.    p->inTrans
211e0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
211f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
21200 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 64  f the handle had
21210 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
21220 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
21230 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20  ecrement the .  
21240 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
21250 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
21260 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
21270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
21280 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72 65 61  ount .    ** rea
21290 63 68 65 73 20 30 2c 20 73 65 74 20 74 68 65 20  ches 0, set the 
212a0 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
212b0 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20  TRANS_NONE. The 
212c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
212d0 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c  sed().    ** cal
212e0 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c  l below will unl
212f0 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e 20 20  ock the pager.  
21300 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  */.    if( p->in
21310 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans!=TRANS_NON
21320 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  E ){.      clear
21330 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
21340 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
21350 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
21360 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66  tion--;.      if
21370 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
21380 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
21390 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
213a0 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  tion = TRANS_NON
213b0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
213c0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
213d0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
213e0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
213f0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
21400 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ock the .    ** 
21410 70 61 67 65 72 20 69 66 20 74 68 69 73 20 63 61  pager if this ca
21420 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e  ll closed the on
21430 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ly read or write
21440 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a   transaction.  *
21450 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  /.    p->inTrans
21460 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
21470 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
21480 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 7d  Unused(pBt);.  }
21490 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
214a0 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ty(p);.}../*.** 
214b0 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  Commit the trans
214c0 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
214d0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
214e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
214f0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
21500 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20  second phase of 
21510 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74  a 2-phase commit
21520 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65  .  The.** sqlite
21530 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21540 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65 20 64  eOne() routine d
21550 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
21560 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a  ase and should.*
21570 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70 72 69  * be invoked pri
21580 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68  or to calling th
21590 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65  is routine.  The
215a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
215b0 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a  mitPhaseOne().**
215c0 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61 6c 6c   routine did all
215d0 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72 69   the work of wri
215e0 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
215f0 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e 64   out to disk and
21600 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a   flushing the.**
21610 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68 61   contents so tha
21620 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74 74  t they are writt
21630 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b  en onto the disk
21640 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20 74   platter.  All t
21650 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68  his.** routine h
21660 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c 65  as to do is dele
21670 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20 6f  te or truncate o
21680 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61 64 65  r zero the heade
21690 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20  r in the.** the 
216a0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
216b0 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
216c0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
216d0 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a  o commit) and.**
216e0 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a   drop locks..**.
216f0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20  ** Normally, if 
21700 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
21710 77 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  while the pager 
21720 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d 70 74  layer is attempt
21730 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c  ing to .** final
21740 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
21750 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ng journal file,
21760 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21770 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
21780 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70 65 72  and.** the upper
21790 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74 74 65   layer will atte
217a0 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20  mpt a rollback. 
217b0 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
217c0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
217d0 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74  ** is non-zero t
217e0 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65 65 20  hen this b-tree 
217f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 70  transaction is p
21800 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66  art of a multi-f
21810 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ile .** transact
21820 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ion. In this cas
21830 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  e, the transacti
21840 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
21850 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a  een committed .*
21860 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67 20 61  * (by deleting a
21870 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
21880 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20 63 61  file) and the ca
21890 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65  ller will ignore
218a0 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69   this .** functi
218b0 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  ons return code.
218c0 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61 6e 20   So, even if an 
218d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
218e0 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2c  the pager layer,
218f0 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 62 2d  .** reset the b-
21900 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69 6e 74  tree objects int
21910 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f 20 69  ernal state to i
21920 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
21930 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61   write.** transa
21940 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 63  ction has been c
21950 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73 20 71  losed. This is q
21960 75 69 74 65 20 73 61 66 65 2c 20 61 73 20 74 68  uite safe, as th
21970 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68 61 76  e pager will hav
21980 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65  e.** transitione
21990 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 73  d to the error s
219a0 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tate..**.** This
219b0 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
219c0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
219d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
219e0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
219f0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
21a00 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
21a10 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
21a20 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
21a30 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21a40 50 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a  PhaseTwo(Btree *
21a50 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75 70 29  p, int bCleanup)
21a60 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  {..  if( p->inTr
21a70 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ans==TRANS_NONE 
21a80 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21a90 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  OK;.  sqlite3Btr
21aa0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62 74  eeEnter(p);.  bt
21ab0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
21ac0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
21ad0 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
21ae0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
21af0 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
21b00 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
21b10 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
21b20 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
21b30 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
21b40 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
21b50 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21b60 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21b70 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74 53 68  int rc;.    BtSh
21b80 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
21b90 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Bt;.    assert( 
21ba0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
21bb0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
21bc0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
21bd0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
21be0 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  >0 );.    rc = s
21bf0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
21c00 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70  tPhaseTwo(pBt->p
21c10 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
21c20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
21c30 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a   bCleanup==0 ){.
21c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
21c50 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
21c60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
21c70 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74 61 56   }.    p->iDataV
21c80 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f  ersion--;  /* Co
21c90 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70 50 61  mpensate for pPa
21ca0 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73 69 6f  ger->iDataVersio
21cb0 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d  n++; */.    pBt-
21cc0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
21cd0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
21ce0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
21cf0 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
21d00 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
21d10 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
21d20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21d40 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21d50 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
21d60 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
21d70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
21d80 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
21d90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
21da0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21db0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21dc0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
21dd0 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
21de0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21df0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
21e00 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21e10 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20  aseTwo(p, 0);.  
21e20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
21e30 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21e40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21e50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21e60 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43  s the state to C
21e70 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20  URSOR_FAULT and 
21e80 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  the error.** cod
21e90 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72  e to errCode for
21ea0 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e   every cursor on
21eb0 20 61 6e 79 20 42 74 53 68 61 72 65 64 20 74 68   any BtShared th
21ec0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
21ed0 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69 66 20  erences.  Or if 
21ee0 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c  the writeOnly fl
21ef0 61 67 20 69 73 20 73 65 74 20 74 6f 20 31 2c 20  ag is set to 1, 
21f00 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69  then only.** tri
21f10 70 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  p write cursors 
21f20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64 20 63  and leave read c
21f30 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67 65 64  ursors unchanged
21f40 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75  ..**.** Every cu
21f50 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64 69 64  rsor is a candid
21f60 61 74 65 20 74 6f 20 62 65 20 74 72 69 70 70 65  ate to be trippe
21f70 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
21f80 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c  sors.** that bel
21f90 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64 61 74  ong to other dat
21fa0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
21fb0 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
21fc0 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74   be.** sharing t
21fd0 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
21fe0 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
21ff0 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
22000 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
22010 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49 66 20  back occurs. If 
22020 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a  the writeOnly.**
22030 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
22040 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63  hen only write-c
22050 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65 20 74  ursors need be t
22060 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e  ripped - read-on
22070 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 61  ly.** cursors sa
22080 76 65 20 74 68 65 69 72 20 63 75 72 72 65 6e 74  ve their current
22090 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20 74 68   positions so th
220a0 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f 6e 74  at they may cont
220b0 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  inue .** followi
220c0 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  ng the rollback.
220d0 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c   Or, if writeOnl
220e0 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20  y is false, all 
220f0 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20  cursors are .** 
22100 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65 6e 65  tripped. In gene
22110 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69  ral, writeOnly i
22120 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 74  s false if the t
22130 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
22140 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
22150 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61 74  modified the dat
22160 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 6e  abase schema. In
22170 20 74 68 69 73 20 63 61 73 65 20 62 2d 74 72 65   this case b-tre
22180 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20  e root.** pages 
22190 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f 72 20  may be moved or 
221a0 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74 68 65  deleted from the
221b0 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f 67 65   database altoge
221c0 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20  ther, making.** 
221d0 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20 72 65  it unsafe for re
221e0 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20 63 6f  ad cursors to co
221f0 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntinue..**.** If
22200 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20 66   the writeOnly f
22210 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e 64 20  lag is true and 
22220 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
22230 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 0a 2a  untered while .*
22240 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63 75 72  * saving the cur
22250 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
22260 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72   a read-only cur
22270 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73  sor, all cursors
22280 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  , .** including 
22290 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f 72 73  all read-cursors
222a0 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a   are tripped..**
222b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
222c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63   returned if suc
222d0 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66 20 61  cessful, or if a
222e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
222f0 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61  hile.** saving a
22300 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
22310 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  , an SQLite erro
22320 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
22330 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
22340 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20  llCursors(Btree 
22350 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72  *pBtree, int err
22360 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f  Code, int writeO
22370 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  nly){.  BtCursor
22380 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20   *p;.  int rc = 
22390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
223a0 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e 6c 79  sert( (writeOnly
223b0 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79  ==0 || writeOnly
223c0 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57 72 69  ==1) && BTCF_Wri
223d0 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69  teFlag==1 );.  i
223e0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
223f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
22400 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
22410 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
22420 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
22430 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
22440 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
22450 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
22460 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
22470 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
22480 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
22490 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
224a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
224b0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
224c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
224d0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
224e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
224f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22500 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
22510 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
22520 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
22530 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
22540 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
22550 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
22560 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
22570 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
22580 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
22590 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
225a0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
225b0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
225c0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
225d0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
225e0 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52 65 6c  }.      btreeRel
225f0 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67  easeAllCursorPag
22600 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  es(p);.    }.   
22610 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
22620 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a  ve(pBtree);.  }.
22630 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22640 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74  /*.** Rollback t
22650 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
22660 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
22670 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73  * If tripCode is
22680 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 20 74   not SQLITE_OK t
22690 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69 6c 6c  hen cursors will
226a0 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20   be invalidated 
226b0 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e  (tripped)..** On
226c0 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  ly write cursors
226d0 20 61 72 65 20 74 72 69 70 70 65 64 20 69 66 20   are tripped if 
226e0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74 72 75  writeOnly is tru
226f0 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73 6f 72  e but all cursor
22700 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70 65 64  s are.** tripped
22710 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
22720 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61 74 74   false.  Any att
22730 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a 20 61  empt to use.** a
22740 20 74 72 69 70 70 65 64 20 63 75 72 73 6f 72 20   tripped cursor 
22750 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
22760 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
22770 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
22780 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
22790 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
227a0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
227b0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
227c0 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
227d0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
227e0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
227f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
22800 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  lback(Btree *p, 
22810 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20 69 6e  int tripCode, in
22820 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20  t writeOnly){.  
22830 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
22840 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
22850 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
22860 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge1;..  assert( 
22870 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20  writeOnly==1 || 
22880 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  writeOnly==0 );.
22890 20 20 61 73 73 65 72 74 28 20 74 72 69 70 43 6f    assert( tripCo
228a0 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54  de==SQLITE_ABORT
228b0 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74 72 69  _ROLLBACK || tri
228c0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
228d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
228e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66  eeEnter(p);.  if
228f0 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49  ( tripCode==SQLI
22900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22910 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73 61 76  = tripCode = sav
22920 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
22930 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
22940 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79 20 3d  rc ) writeOnly =
22950 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
22960 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22970 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69 70 43  .  }.  if( tripC
22980 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ode ){.    int r
22990 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
229a0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
229b0 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77 72 69  p, tripCode, wri
229c0 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61 73 73  teOnly);.    ass
229d0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
229e0 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e 6c 79  OK || (writeOnly
229f0 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51 4c 49  ==0 && rc2==SQLI
22a00 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20 69 66  TE_OK) );.    if
22a10 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
22a20 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 7d   ) rc = rc2;.  }
22a30 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
22a40 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  y(p);..  if( p->
22a50 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
22a60 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
22a70 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  rc2;..    assert
22a80 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
22a90 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
22aa0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
22ab0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
22ac0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
22ad0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
22ae0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22af0 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
22b00 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
22b10 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
22b20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
22b30 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
22b40 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
22b50 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67 65 28  ll btreeGetPage(
22b60 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
22b70 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
22b80 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
22b90 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
22ba0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
22bb0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
22bc0 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30  t, 1, &pPage1, 0
22bd0 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
22be0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
22bf0 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b 28 75  = get4byte(28+(u
22c00 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
22c10 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
22c20 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20  e( nPage==0 );. 
22c30 20 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d       if( nPage==
22c40 30 20 29 20 73 71 6c 69 74 65 33 50 61 67 65 72  0 ) sqlite3Pager
22c50 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
22c60 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
22c70 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
22c80 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50 61 67  pBt->nPage!=nPag
22c90 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e );.      pBt->
22ca0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20  nPage = nPage;. 
22cb0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
22cc0 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  One(pPage1);.   
22cd0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
22ce0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
22cf0 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20  (pBt, 1)==0 );. 
22d00 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
22d10 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
22d20 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65  AD;.    btreeCle
22d30 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
22d40 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45  );.  }..  btreeE
22d50 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29  ndTransaction(p)
22d60 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
22d70 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
22d80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22d90 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e  Start a statemen
22da0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22db0 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  . The subtransac
22dc0 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c  tion can be roll
22dd0 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70  ed.** back indep
22de0 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20  endently of the 
22df0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
22e00 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  . You must start
22e10 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a   a transaction .
22e20 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69  ** before starti
22e30 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74  ng a subtransact
22e40 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e  ion. The subtran
22e50 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
22e60 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a   automatically .
22e70 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74  ** if the main t
22e80 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69  ransaction commi
22e90 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b  ts or rolls back
22ea0 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
22eb0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
22ec0 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
22ed0 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
22ee0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
22ef0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
22f00 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
22f10 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
22f20 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
22f30 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
22f40 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
22f50 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
22f60 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
22f70 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
22f80 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
22f90 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
22fa0 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
22fb0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
22fc0 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d  ..**.** A statem
22fd0 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74  ent sub-transact
22fe0 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ion is implement
22ff0 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f  ed as an anonymo
23000 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68  us savepoint. Th
23010 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65  e.** value passe
23020 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
23030 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
23040 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
23050 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20   savepoints,.** 
23060 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65  including the ne
23070 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  w anonymous save
23080 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74  point, open on t
23090 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20  he B-Tree. i.e. 
230a0 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  if there.** are 
230b0 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  no active savepo
230c0 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ints and no othe
230d0 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  r statement-tran
230e0 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a  sactions open,.*
230f0 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  * iStatement is 
23100 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75  1. This anonymou
23110 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20  s savepoint can 
23120 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72  be released or r
23130 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73  olled back.** us
23140 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42  ing the sqlite3B
23150 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20  treeSavepoint() 
23160 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
23170 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
23180 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c  inStmt(Btree *p,
23190 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29   int iStatement)
231a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
231b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
231c0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
231d0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
231e0 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61  assert( p->inTra
231f0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23200 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  );.  assert( (pB
23210 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
23220 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
23230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23240 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61  atement>0 );.  a
23250 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e  ssert( iStatemen
23260 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  t>p->db->nSavepo
23270 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  int );.  assert(
23280 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
23290 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
232a0 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20   );.  /* At the 
232b0 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73  pager level, a s
232c0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
232d0 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f  tion is a savepo
232e0 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e  int with.  ** an
232f0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
23300 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e  han all savepoin
23310 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69  ts created expli
23320 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a  citly using.  **
23330 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e   SQL statements.
23340 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
23350 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20  o open, release 
23360 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a  or rollback any.
23370 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f    ** such savepo
23380 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73  ints while the s
23390 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
233a0 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
233b0 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20  s active..  */. 
233c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
233d0 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28  erOpenSavepoint(
233e0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74  pBt->pPager, iSt
233f0 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69  atement);.  sqli
23400 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23410 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
23420 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ../*.** The seco
23430 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
23440 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70  his function, op
23450 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45  , is always SAVE
23460 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a  POINT_ROLLBACK.*
23470 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  * or SAVEPOINT_R
23480 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e  ELEASE. This fun
23490 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c  ction either rel
234a0 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62  eases or rolls b
234b0 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70  ack the.** savep
234c0 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20  oint identified 
234d0 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61  by parameter iSa
234e0 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69  vepoint, dependi
234f0 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ng on the value 
23500 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a  .** of op..**.**
23510 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65   Normally, iSave
23520 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72  point is greater
23530 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
23540 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c  o zero. However,
23550 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56   if op is.** SAV
23560 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
23570 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74   then iSavepoint
23580 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e   may also be -1.
23590 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
235a0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
235b0 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  f the entire tra
235c0 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c  nsaction are rol
235d0 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69  led back. This i
235e0 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  s different.** f
235f0 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61  rom a normal tra
23600 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
23610 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61  k, as no locks a
23620 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20  re released and 
23630 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
23640 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e  on remains open.
23650 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23660 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74  treeSavepoint(Bt
23670 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  ree *p, int op, 
23680 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b  int iSavepoint){
23690 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
236a0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26  TE_OK;.  if( p &
236b0 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  & p->inTrans==TR
236c0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
236d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
236e0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
236f0 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49  ert( op==SAVEPOI
23700 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70  NT_RELEASE || op
23710 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23720 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  BACK );.    asse
23730 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
23740 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74  0 || (iSavepoint
23750 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45  ==-1 && op==SAVE
23760 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20  POINT_ROLLBACK) 
23770 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
23780 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20  reeEnter(p);.   
23790 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49   if( op==SAVEPOI
237a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
237b0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
237c0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
237d0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
237e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
237f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
23800 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
23810 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
23820 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
23830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
23840 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23850 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
23860 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
23870 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
23880 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
23890 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
238a0 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
238b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
238c0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
238d0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
238e0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
238f0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
23900 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
23910 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
23920 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
23930 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
23940 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
23950 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
23960 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
23970 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
23980 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
23990 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
239a0 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
239b0 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
239c0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
239d0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
239e0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
239f0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
23a00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23a10 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
23a20 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
23a30 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
23a40 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
23a50 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
23a60 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
23a70 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
23a80 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
23a90 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
23aa0 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
23ab0 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
23ac0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
23ad0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
23ae0 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
23af0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
23b00 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
23b10 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
23b20 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
23b30 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
23b40 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
23b50 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
23b60 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
23b70 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
23b80 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
23b90 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
23ba0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
23bb0 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
23bc0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
23bd0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
23be0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
23bf0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
23c00 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
23c10 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
23c20 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
23c30 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
23c40 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
23c50 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
23c60 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
23c70 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
23c80 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
23c90 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
23ca0 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
23cb0 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
23cc0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
23cd0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
23ce0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
23cf0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
23d00 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
23d10 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
23d20 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
23d30 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
23d40 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
23d50 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
23d60 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
23d70 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
23d80 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
23d90 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
23da0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
23db0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
23dc0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
23dd0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
23de0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
23df0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
23e00 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
23e10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
23e20 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
23e30 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
23e40 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
23e50 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
23e60 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
23e70 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
23e80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23e90 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
23ea0 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
23eb0 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
23ec0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
23ed0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
23ee0 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
23ef0 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
23f00 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
23f10 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23f20 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
23f30 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
23f40 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
23f50 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
23f60 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
23f70 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
23f80 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
23f90 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
23fa0 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
23fb0 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
23fc0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
23fd0 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
23fe0 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
23ff0 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
24000 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
24010 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
24020 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
24030 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
24040 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
24050 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
24060 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
24070 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
24080 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
24090 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
240a0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
240b0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
240c0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
240d0 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
240e0 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
240f0 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
24100 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
24110 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
24120 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
24130 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
24140 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
24150 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
24160 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
24170 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
24180 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
24190 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
241a0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
241b0 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
241c0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
241d0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
241e0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
241f0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
24200 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
24210 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
24220 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
24230 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
24240 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
24250 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
24260 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24290 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
242a0 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242c0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
242d0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
242e0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
242f0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
24300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24310 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
24320 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
24330 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
24340 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
24350 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
24360 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
24370 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
24380 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243a0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
243b0 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
243c0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
243d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
243e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
243f0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
24400 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
24410 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
24440 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
24450 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
24460 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
24470 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
24480 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
24490 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
244a0 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
244b0 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
244c0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
244d0 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
244e0 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
244f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
24500 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
24510 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
24520 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
24530 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
24540 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
24550 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24560 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
24570 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
24580 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
24590 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
245a0 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
245b0 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
245c0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
245d0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
245e0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
245f0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
24600 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
24610 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
24620 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
24630 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
24640 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
24650 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
24660 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
24670 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
24680 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
24690 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
246a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
246b0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
246c0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
246d0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
246e0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
246f0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
24700 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
24710 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
24720 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
24730 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
24740 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
24750 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
24760 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
24770 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
24780 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
24790 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
247a0 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
247b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
247c0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
247d0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
247e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
247f0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
24800 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
24810 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
24820 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
24830 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
24840 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
24850 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
24860 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
24870 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
24880 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
24890 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
248a0 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
248b0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
248c0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
248d0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
248e0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
248f0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
24900 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
24910 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
24920 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
24930 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
24940 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
24950 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
24960 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
24970 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
24980 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
24990 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
249a0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
249b0 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
249c0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
249d0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
249e0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
249f0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
24a00 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
24a10 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
24a20 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
24a30 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
24a40 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
24a50 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
24a60 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
24a70 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
24a80 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
24a90 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
24aa0 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
24ab0 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
24ac0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
24ad0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
24ae0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
24af0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
24b00 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
24b10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
24b20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24b30 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
24b40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
24b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b60 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
24b70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
24b80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
24bb0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
24bc0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
24bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24bf0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
24c00 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
24c10 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
24c20 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
24c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24c40 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
24c50 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
24c60 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
24c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
24c90 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
24ca0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
24cb0 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
24cc0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
24cd0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
24ce0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
24cf0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
24d00 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
24d10 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
24d20 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
24d30 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
24d40 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
24d50 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
24d60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24d70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
24d80 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
24d90 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
24da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
24db0 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
24dc0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
24dd0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
24de0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
24df0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
24e00 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
24e10 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
24e20 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
24e30 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
24e40 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
24e50 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
24e60 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
24e70 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
24e80 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
24e90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
24ea0 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
24eb0 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
24ec0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
24ed0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
24ee0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
24ef0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
24f00 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
24f10 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
24f20 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
24f30 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
24f40 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
24f50 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
24f60 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
24f70 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
24f80 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
24f90 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
24fa0 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
24fb0 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
24fc0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
24fd0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
24fe0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
24ff0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
25000 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
25010 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
25020 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
25030 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
25040 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
25050 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
25060 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
25070 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55 52 53  BtCursor, BTCURS
25080 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49 54 29  OR_FIRST_UNINIT)
25090 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
250a0 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
250b0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
250c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
250d0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
250e0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
250f0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
25100 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
25110 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
25120 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25130 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
25140 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
25150 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
25160 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
25170 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
25180 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
25190 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
251a0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
251b0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
251c0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
251d0 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
251e0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
251f0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
25200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
25210 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
25220 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
25230 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
25240 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
25250 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
25260 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
25270 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
25280 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
252a0 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
252b0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
252c0 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
252d0 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
252e0 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
252f0 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
25300 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72  );.    unlockBtr
25310 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
25320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
25330 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  e(pCur->aOverflo
25340 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  w);.    sqlite3_
25350 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
25360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
25370 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b  eeLeave(pBtree);
25380 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74 72 65  .    pCur->pBtre
25390 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
253a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
253b0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
253c0 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
253d0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
253e0 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
253f0 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
25400 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
25410 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
25420 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
25430 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
25440 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69  l() to fill it i
25450 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f  n..**.** BtCurso
25460 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68  r.info is a cach
25470 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61  e of the informa
25480 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72  tion in the curr
25490 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69  ent cell..** Usi
254a0 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65  ng this cache re
254b0 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72  duces the number
254c0 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72   of calls to btr
254d0 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a  eeParseCell()..*
254e0 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
254f0 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 65  .  static int ce
25500 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65 6c 6c  llInfoEqual(Cell
25510 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49 6e 66  Info *a, CellInf
25520 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28 20 61  o *b){.    if( a
25530 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65 79 20  ->nKey!=b->nKey 
25540 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25550 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61 64 21  if( a->pPayload!
25560 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29 20 72  =b->pPayload ) r
25570 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
25580 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d 62 2d   a->nPayload!=b-
25590 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65 74 75  >nPayload ) retu
255a0 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d  rn 0;.    if( a-
255b0 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c 6f 63  >nLocal!=b->nLoc
255c0 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
255d0 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a 65 21     if( a->nSize!
255e0 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65 74 75  =b->nSize ) retu
255f0 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 0;.    return
25600 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63   1;.  }.  static
25610 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c   void assertCell
25620 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
25630 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e  Cur){.    CellIn
25640 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d  fo info;.    mem
25650 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69  set(&info, 0, si
25660 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20  zeof(info));.   
25670 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25680 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
25690 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b 0a 20  r->ix, &info);. 
256a0 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
256b0 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49 6e 66  PT_DB || cellInf
256c0 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20 26 70  oEqual(&info, &p
256d0 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a 20 20  Cur->info) );.  
256e0 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e  }.#else.  #defin
256f0 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f  e assertCellInfo
25700 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  (x).#endif.stati
25710 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
25720 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e  E void getCellIn
25730 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  fo(BtCursor *pCu
25740 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  r){.  if( pCur->
25750 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
25760 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
25770 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
25780 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
25790 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
257a0 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78 2c 26  pPage,pCur->ix,&
257b0 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
257c0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
257d0 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
257e0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
257f0 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
25800 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
25810 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
25820 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
25830 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
25840 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
25850 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
25860 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
25870 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
25880 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
25890 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
258a0 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
258b0 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
258c0 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
258d0 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
258e0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
258f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
25900 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
25910 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
25920 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
25930 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
25940 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
25950 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25960 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
25970 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
25980 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
25990 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
259a0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
259b0 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
259c0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
259d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
259e0 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
259f0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
25a00 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
25a10 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
25a20 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
25a30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25a40 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
25a50 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
25a60 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
25a70 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
25a80 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
25a90 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
25aa0 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
25ab0 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
25ac0 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
25ad0 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
25ae0 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
25af0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
25b00 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
25b10 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
25b20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
25b30 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
25b40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25b50 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25b60 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25b70 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
25b80 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
25b90 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25ba0 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
25bb0 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64 65 66  .nKey;.}..#ifdef
25bc0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4f   SQLITE_ENABLE_O
25bd0 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 0a 2f  FFSET_SQL_FUNC./
25be0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
25bf0 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  offset into the 
25c00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
25c10 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  r the start of t
25c20 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20 74 6f  he.** payload to
25c30 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
25c40 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  r is pointing..*
25c50 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74 72  /.i64 sqlite3Btr
25c60 65 65 4f 66 66 73 65 74 28 42 74 43 75 72 73 6f  eeOffset(BtCurso
25c70 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
25c80 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
25c90 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
25ca0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25cb0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25cc0 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ID );.  getCellI
25cd0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65 74  nfo(pCur);.  ret
25ce0 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d 3e 70  urn (i64)pCur->p
25cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 28 69  Bt->pageSize*((i
25d00 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  64)pCur->pPage->
25d10 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20 20 20  pgno - 1) +.    
25d20 20 20 20 20 20 28 69 36 34 29 28 70 43 75 72 2d       (i64)(pCur-
25d30 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d  >info.pPayload -
25d40 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44   pCur->pPage->aD
25d50 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ata);.}.#endif /
25d60 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
25d70 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43 20  OFFSET_SQL_FUNC 
25d80 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25d90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
25da0 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20  ytes of payload 
25db0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
25dc0 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75  at pCur is.** cu
25dd0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
25de0 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20   to.  For table 
25df0 62 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c  btrees, this wil
25e00 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a  l be the amount.
25e10 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72  ** of data.  For
25e20 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74   index btrees, t
25e30 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20  his will be the 
25e40 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e  size of the key.
25e50 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
25e60 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  r must guarantee
25e70 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
25e80 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
25e90 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61  a non-NULL.** va
25ea0 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f  lid entry.  In o
25eb0 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
25ec0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
25ed0 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65  e must guarantee
25ee0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
25ef0 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65  sor has Cursor.e
25f00 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
25f10 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69  LID..*/.u32 sqli
25f20 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53  te3BtreePayloadS
25f30 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ize(BtCursor *pC
25f40 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
25f50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
25f60 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
25f70 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
25f80 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
25f90 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
25fa0 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
25fb0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25fc0 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  ad;.}../*.** Giv
25fd0 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  en the page numb
25fe0 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  er of an overflo
25ff0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  w page in the da
26000 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65  tabase (paramete
26010 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73  r.** ovfl), this
26020 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20   function finds 
26030 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
26040 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  of the next page
26050 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b   in the .** link
26060 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66  ed list of overf
26070 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f  low pages. If po
26080 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20  ssible, it uses 
26090 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a  the auto-vacuum.
260a0 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64  ** pointer-map d
260b0 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72  ata instead of r
260c0 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  eading the conte
260d0 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20  nt of page ovfl 
260e0 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a  to do so. .**.**
260f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
26100 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72  urs an SQLite er
26110 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
26120 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a  rned. Otherwise:
26130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
26140 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
26150 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  xt overflow page
26160 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
26170 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74  ist is .** writt
26180 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
26190 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69  . If page ovfl i
261a0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
261b0 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a  in its linked .*
261c0 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65  * list, *pPgnoNe
261d0 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  xt is set to zer
261e0 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50  o. .**.** If ppP
261f0 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  age is not NULL,
26200 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65   and a reference
26210 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20   to the MemPage 
26220 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e  object correspon
26230 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20  ding.** to page 
26240 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73  number pOvfl was
26250 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20   obtained, then 
26260 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
26270 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a  o point to that.
26280 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74  ** reference. It
26290 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
262a0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
262b0 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c  ller to call rel
262c0 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e  easePage().** on
262d0 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65   *ppPage to free
262e0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20   the reference. 
262f0 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20  In no reference 
26300 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65  was obtained (be
26310 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69  cause.** the poi
26320 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65  nter-map was use
26330 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20  d to obtain the 
26340 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f  value for *pPgno
26350 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a  Next), then.** *
26360 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
26370 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
26380 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77   int getOverflow
26390 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
263a0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
263b0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
263c0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
263d0 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20  gno ovfl,       
263e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
263f0 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  urrent overflow 
26400 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
26410 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
26420 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
26430 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61   OUT: MemPage ha
26440 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c  ndle (may be NUL
26450 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  L) */.  Pgno *pP
26460 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
26470 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
26480 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
26490 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
264a0 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
264b0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
264c0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   0;.  int rc = S
264d0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
264e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
264f0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
26500 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
26510 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66  pPgnoNext);..#if
26520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
26530 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
26540 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65   Try to find the
26550 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26560 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
26570 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61  using the.  ** a
26580 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65  utovacuum pointe
26590 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65  r-map pages. Gue
265a0 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74  ss that the next
265b0 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74   page in .  ** t
265c0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
265d0 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20   is page number 
265e0 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61  (ovfl+1). If tha
265f0 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20  t guess turns . 
26600 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72   ** out to be wr
26610 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74  ong, fall back t
26620 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61  o loading the da
26630 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a  ta of page .  **
26640 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20   number ovfl to 
26650 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65  determine the ne
26660 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  xt page number..
26670 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e    */.  if( pBt->
26680 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26690 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20    Pgno pgno;.   
266a0 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f   Pgno iGuess = o
266b0 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54  vfl+1;.    u8 eT
266c0 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28  ype;..    while(
266d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
266e0 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69  Bt, iGuess) || i
266f0 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42  Guess==PENDING_B
26700 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
26710 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b  .      iGuess++;
26720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26730 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67  iGuess<=btreePag
26740 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
26750 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
26760 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c  Get(pBt, iGuess,
26770 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b   &eType, &pgno);
26780 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
26790 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70  QLITE_OK && eTyp
267a0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
267b0 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66  OW2 && pgno==ovf
267c0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78  l ){.        nex
267d0 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20  t = iGuess;.    
267e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
267f0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
26800 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
26810 20 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d    assert( next==
26820 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  0 || rc==SQLITE_
26830 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
26840 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26850 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
26860 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
26870 26 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d  &pPage, (ppPage=
26880 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  =0) ? PAGER_GET_
26890 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20  READONLY : 0);. 
268a0 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
268b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67  QLITE_OK || pPag
268c0 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e==0 );.    if( 
268d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
268e0 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
268f0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
26900 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
26910 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
26920 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61  next;.  if( ppPa
26930 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67  ge ){.    *ppPag
26940 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c  e = pPage;.  }el
26950 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
26960 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  age(pPage);.  }.
26970 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51    return (rc==SQ
26980 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49  LITE_DONE ? SQLI
26990 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a  TE_OK : rc);.}..
269a0 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20  /*.** Copy data 
269b0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f  from a buffer to
269c0 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d   a page, or from
269d0 20 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66   a page to a buf
269e0 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c  fer..**.** pPayl
269f0 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72  oad is a pointer
26a00 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20   to data stored 
26a10 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65  on database page
26a20 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20   pDbPage..** If 
26a30 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20  argument eOp is 
26a40 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74  false, then nByt
26a50 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
26a60 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72  are copied.** fr
26a70 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74  om pPayload to t
26a80 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
26a90 64 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66  d at by pBuf. If
26aa0 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a   eOp is true,.**
26ab0 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67   then sqlite3Pag
26ac0 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  erWrite() is cal
26ad0 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61  led on pDbPage a
26ae0 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a  nd nByte bytes.*
26af0 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  * of data are co
26b00 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75  pied from the bu
26b10 66 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61  ffer pBuf to pPa
26b20 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  yload..**.** SQL
26b30 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
26b40 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f  ed on success, o
26b50 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
26b60 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
26b70 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61  c int copyPayloa
26b80 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c  d(.  void *pPayl
26b90 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  oad,           /
26ba0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  * Pointer to pag
26bb0 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  e data */.  void
26bc0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
26bd0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
26be0 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20   to buffer */.  
26bf0 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
26c00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26c10 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
26c20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f  copy */.  int eO
26c30 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
26c40 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79      /* 0 -> copy
26c50 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e   from page, 1 ->
26c60 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f   copy to page */
26c70 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
26c80 67 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge           /* 
26c90 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
26ca0 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20  pPayload */.){. 
26cb0 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20   if( eOp ){.    
26cc0 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
26cd0 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65  m buffer to page
26ce0 20 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74   (a write operat
26cf0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ion) */.    int 
26d00 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
26d10 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  rWrite(pDbPage);
26d20 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
26d30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26d40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
26d50 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79  .    memcpy(pPay
26d60 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74  load, pBuf, nByt
26d70 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
26d80 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
26d90 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65  om page to buffe
26da0 72 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74  r (a read operat
26db0 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63  ion) */.    memc
26dc0 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61  py(pBuf, pPayloa
26dd0 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20  d, nByte);.  }. 
26de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
26df0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
26e00 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
26e10 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65  d to read or ove
26e20 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69  rwrite payload i
26e30 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f  nformation.** fo
26e40 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
26e50 20 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72   the pCur cursor
26e60 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
26e70 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75   The eOp.** argu
26e80 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65  ment is interpre
26e90 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ted as follows:.
26ea0 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f  **.**   0: The o
26eb0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
26ec0 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ad. Populate the
26ed0 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e   overflow cache.
26ee0 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65  .**   1: The ope
26ef0 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74  ration is a writ
26f00 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
26f10 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
26f20 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
26f30 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
26f40 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
26f50 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
26f60 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
26f70 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
26f80 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
26f90 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  uf..**.** The co
26fa0 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64  ntent being read
26fb0 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68   or written migh
26fc0 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  t appear on the 
26fd0 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20  main page.** or 
26fe0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
26ff0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
27000 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a  rflow pages..**.
27010 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
27020 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75  t cursor entry u
27030 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ses one or more 
27040 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 2a  overflow pages.*
27050 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
27060 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61  may allocate spa
27070 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
27080 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20 74 68  y populate.** th
27090 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
270a0 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
270b0 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
270c0 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
270d0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
270e0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
270f0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
27100 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
27110 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
27120 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
27130 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
27140 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
27150 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
27160 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69   it must be.** i
27170 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
27180 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
27190 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
271a0 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
271b0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
271c0 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
271d0 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
271e0 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
271f0 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
27200 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
27210 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
27220 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
27230 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27240 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
27250 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
27260 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
27270 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
27280 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
27290 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
272a0 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
272b0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
272c0 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
272d0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
272e0 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
272f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
27300 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
27310 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
27320 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
27330 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20  u32 offset,     
27340 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
27350 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
27360 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
27370 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20   u32 amt,       
27380 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
27390 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
273a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
273b0 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
273c0 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
273d0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
273e0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
273f0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
27400 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
27410 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
27420 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
27430 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
27440 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
27450 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
27460 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
27470 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
27480 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27490 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66  /* Btree page of
274a0 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a   current entry *
274b0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
274c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20  t = pCur->pBt;  
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274e0 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75  /* Btree this cu
274f0 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20  rsor belongs to 
27500 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27510 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
27520 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64  _READ.  unsigned
27530 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42   char * const pB
27540 75 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 20  ufStart = pBuf; 
27550 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20      /* Start of 
27560 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62 75 66  original out buf
27570 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  fer */.#endif.. 
27580 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20 29   assert( pPage )
27590 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d  ;.  assert( eOp=
275a0 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29 3b 0a  =0 || eOp==1 );.
275b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
275c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
275d0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
275e0 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65  ( pCur->ix<pPage
275f0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
27600 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
27610 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
27620 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
27630 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
27640 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  = pCur->info.pPa
27650 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72 74 28  yload;.  assert(
27660 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
27670 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27680 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ad );..  assert(
27690 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50 61 67   aPayload > pPag
276a0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 69 66  e->aData );.  if
276b0 28 20 28 75 70 74 72 29 28 61 50 61 79 6c 6f 61  ( (uptr)(aPayloa
276c0 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  d - pPage->aData
276d0 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62 6c 65  ) > (pBt->usable
276e0 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69 6e 66  Size - pCur->inf
276f0 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20 20 20  o.nLocal) ){.   
27700 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65   /* Trying to re
27710 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73 74  ad or write past
27720 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
27730 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72  data is an error
27740 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 63 6f  .  The.    ** co
27750 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 20  nditional above 
27760 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20 20 2a  is really:.    *
27770 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64 5b 70  *    &aPayload[p
27780 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
27790 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
277a0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
277b0 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20 69 73  e].    ** but is
277c0 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69 74 73   recast into its
277d0 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20 74 6f   current form to
277e0 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72 20 6f   avoid integer o
277f0 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65 6d 73  verflow problems
27800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
27810 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
27820 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
27830 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
27840 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
27850 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
27860 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
27870 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
27880 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
27890 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
278a0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
278b0 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
278c0 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
278d0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
278e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
278f0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
27900 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
27910 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
27920 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
27930 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
27940 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
27950 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
27960 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
27970 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
27980 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
27990 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
279a0 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d  .  }...  if( rc=
279b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
279c0 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  t>0 ){.    const
279d0 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20   u32 ovflSize = 
279e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
279f0 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63  - 4;  /* Bytes c
27a00 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20  ontent per ovfl 
27a10 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  page */.    Pgno
27a20 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20   nextPage;..    
27a30 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
27a40 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43  yte(&aPayload[pC
27a50 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d  ur->info.nLocal]
27a60 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  );..    /* If th
27a70 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
27a80 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62  flow[] has not b
27a90 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  een allocated, a
27aa0 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a  llocate it now..
27ab0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
27ac0 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
27ad0 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20  ray is sized at 
27ae0 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
27af0 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
27b00 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f  .    ** in the o
27b10 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
27b20 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
27b30 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
27b40 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20  flow page is.   
27b50 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   ** stored in aO
27b60 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e  verflow[0], etc.
27b70 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
27b80 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
27b90 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65   array.    ** me
27ba0 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
27bb0 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69  wn" (the cache i
27bc0 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
27bd0 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
27be0 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
27bf0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
27c00 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
27c10 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
27c20 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
27c30 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
27c40 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
27c50 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
27c60 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
27c70 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20 20 7c  flow==0.       |
27c80 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73 69 7a  | nOvfl*(int)siz
27c90 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71 6c 69  eof(Pgno) > sqli
27ca0 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 43  te3MallocSize(pC
27cb0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 0a 20  ur->aOverflow). 
27cc0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
27cd0 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
27ce0 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
27cf0 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
27d00 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
27d10 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
27d20 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
27d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
27d40 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
27d50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d60 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d80 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
27d90 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20  flow = aNew;.   
27da0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27db0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
27dc0 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
27dd0 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
27de0 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  o));.      pCur-
27df0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
27e00 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
27e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
27e20 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
27e30 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
27e40 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
27e50 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
27e60 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
27e70 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
27e80 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
27e90 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
27ea0 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79       ** directly
27eb0 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f   to it..      */
27ec0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
27ed0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
27ee0 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20  t/ovflSize] ){. 
27ef0 20 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f         iIdx = (o
27f00 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
27f10 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67  .        nextPag
27f20 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
27f30 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
27f40 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
27f50 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
27f60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
27f70 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27f80 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
27f90 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e   );.    while( n
27fa0 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20 20 20  extPage ){.     
27fb0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
27fc0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
27fd0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27fe0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
27ff0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
28000 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
28010 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
28020 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  || pCur->aOverfl
28030 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61  ow[iIdx]==nextPa
28040 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge.             
28050 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
28060 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f  ;.      pCur->aO
28070 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
28080 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 20  nextPage;..     
28090 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66   if( offset>=ovf
280a0 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  lSize ){.       
280b0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61   /* The only rea
280c0 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73  son to read this
280d0 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61   page is to obta
280e0 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  in the page.    
280f0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f      ** number fo
28100 72 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  r the next page 
28110 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
28120 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a  chain. The page.
28130 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20          ** data 
28140 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
28150 20 53 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f   So first try to
28160 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72   lookup the over
28170 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  flow.        ** 
28180 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c  page-list cache,
28190 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61   if any, then fa
281a0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67  ll back to the g
281b0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29  etOverflowPage()
281c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63  .        ** func
281d0 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  tion..        */
281e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
281f0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
28200 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
28210 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
28220 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
28230 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
28240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
28250 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28260 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
28270 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
28280 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28290 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
282a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
282b0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
282c0 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
282d0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
282e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
282f0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
28300 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
28310 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
28320 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
28330 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
28340 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
28350 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
28360 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
28370 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
28380 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
28390 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
283a0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
283b0 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d        int a = am
283c0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  t;.        if( a
283d0 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c   + offset > ovfl
283e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
283f0 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d    a = ovflSize -
28400 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20   offset;.       
28410 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
28420 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f  E_DIRECT_OVERFLO
28430 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f  W_READ.        /
28440 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c  * If all the fol
28450 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
28460 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
28470 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73      **   1) this
28480 20 69 73 20 61 20 72 65 61 64 20 6f 70 65 72 61   is a read opera
28490 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20  tion, and .     
284a0 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20     **   2) data 
284b0 69 73 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d  is required from
284c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
284d0 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  is overflow page
284e0 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a  , and.        **
284f0 20 20 20 33 29 20 74 68 65 72 65 20 61 72 65 20     3) there are 
28500 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73 20 69  no dirty pages i
28510 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
28520 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29  .        **   4)
28530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
28540 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e   file-backed, an
28550 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 35  d.        **   5
28560 29 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  ) the page is no
28570 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66 69 6c  t in the WAL fil
28580 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36  e.        **   6
28590 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
285a0 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
285b0 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
285c0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
285d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
285e0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
285f0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
28600 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
28610 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
28620 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
28630 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
28640 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
28650 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
28660 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
28670 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
28680 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
28690 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
286a0 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
286b0 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
286c0 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
286d0 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =0              
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28700 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
28710 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
28750 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  /.         && sq
28760 6c 69 74 65 33 50 61 67 65 72 44 69 72 65 63 74  lite3PagerDirect
28770 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50 61 67  ReadOk(pBt->pPag
28780 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20 20 20  er, nextPage)   
28790 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f 0a 20   /* (3,4,5) */. 
287a0 20 20 20 20 20 20 20 20 26 26 20 26 70 42 75 66          && &pBuf
287b0 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72 74 20  [-4]>=pBufStart 
287c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
287e0 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
287f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
28800 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20  ite3_file *fd = 
28810 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
28820 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
28830 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
28840 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
28850 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
28860 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
28870 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
28880 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20 74 6f         /* due to
288b0 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
288c0 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20    memcpy(aSave, 
288d0 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20  aWrite, 4);.    
288e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
288f0 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72  e3OsRead(fd, aWr
28900 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70  ite, a+4, (i64)p
28910 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65  Bt->pageSize*(ne
28920 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20  xtPage-1));.    
28930 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
28940 20 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65   get4byte(aWrite
28950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
28960 63 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76  cpy(aWrite, aSav
28970 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 4);.        }
28980 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20  else.#endif..   
28990 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
289a0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
289b0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
289c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
289d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
289e0 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
289f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28a00 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45 52 5f  (eOp==0 ? PAGER_
28a10 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30  GET_READONLY : 0
28a20 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ).          );. 
28a30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
28a40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28a50 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
28a60 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
28a70 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
28a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
28a90 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
28aa0 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20  te(aPayload);.  
28ab0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63            rc = c
28ac0 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79  opyPayload(&aPay
28ad0 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20  load[offset+4], 
28ae0 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44  pBuf, a, eOp, pD
28af0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
28b00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
28b10 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
28b20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 66 73              offs
28b30 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  et = 0;.        
28b40 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
28b50 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a        amt -= a;.
28b60 20 20 20 20 20 20 20 20 69 66 28 20 61 6d 74 3d          if( amt=
28b70 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
28b80 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
28b90 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  a;.      }.     
28ba0 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
28bb0 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b 0a 20  .      iIdx++;. 
28bc0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
28bd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
28be0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a   amt>0 ){.    /*
28bf0 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   Overflow chain 
28c00 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65 6c 79  ends prematurely
28c10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
28c20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
28c30 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  GE(pPage);.  }. 
28c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28c50 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
28c60 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f  f the payload fo
28c70 72 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69  r the row at whi
28c80 63 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ch that cursor p
28c90 43 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  Cur is currently
28ca0 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22  .** pointing.  "
28cb0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
28cc0 62 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69  be transferred i
28cd0 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
28ce0 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
28cf0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
28d00 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20  .**.** pCur can 
28d10 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  be pointing to e
28d20 69 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72  ither a table or
28d30 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65   an index b-tree
28d40 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67  ..** If pointing
28d50 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65   to a table btre
28d60 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  e, then the cont
28d70 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72  ent section is r
28d80 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72  ead.  If.** pCur
28d90 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20   is pointing to 
28da0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
28db0 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63  then the key sec
28dc0 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a  tion is read..**
28dd0 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42  .** For sqlite3B
28de0 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74  treePayload(), t
28df0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
28e00 6e 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20  nsure that pCur 
28e10 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  is pointing.** t
28e20 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e  o a valid row in
28e30 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72   the table.  For
28e40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
28e50 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74  loadChecked(), t
28e60 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67  he.** cursor mig
28e70 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72  ht be invalid or
28e80 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62   might need to b
28e90 65 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72  e restored befor
28ea0 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a  e being read..**
28eb0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
28ec0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
28ed0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
28ee0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
28ef0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
28f00 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
28f10 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
28f20 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
28f30 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
28f40 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
28f50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  t sqlite3BtreePa
28f60 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a  yload(BtCursor *
28f70 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
28f80 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
28f90 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74  *pBuf){.  assert
28fa0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
28fb0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
28fc0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28fd0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28ff0 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
29000 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
29010 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29020 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  x<pCur->pPage->n
29030 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
29040 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
29050 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
29060 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
29070 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
29080 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69 61 6e  *.** This varian
29090 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  t of sqlite3Btre
290a0 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72 6b 73  ePayload() works
290b0 20 65 76 65 6e 20 69 66 20 74 68 65 20 63 75 72   even if the cur
290c0 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 69  sor has not.** i
290d0 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56 41 4c  n the CURSOR_VAL
290e0 49 44 20 73 74 61 74 65 2e 20 20 49 74 20 69 73  ID state.  It is
290f0 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 74 68   only used by th
29100 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  e sqlite3_blob_r
29110 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72 66 61  ead().** interfa
29120 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ce..*/.#ifndef S
29130 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
29140 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c 49 54  LOB.static SQLIT
29150 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 61  E_NOINLINE int a
29160 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63  ccessPayloadChec
29170 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ked(.  BtCursor 
29180 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f 66 66  *pCur,.  u32 off
29190 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74 2c 0a  set,.  u32 amt,.
291a0 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29 7b 0a    void *pBuf.){.
291b0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28    int rc;.  if (
291c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
291d0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
291e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
291f0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20  TE_ABORT;.  }.  
29200 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29210 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29220 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65   );.  rc = btree
29230 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  RestoreCursorPos
29240 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 72  ition(pCur);.  r
29250 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20 3a 20  eturn rc ? rc : 
29260 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
29270 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
29280 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69 6e 74   pBuf, 0);.}.int
29290 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
292a0 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74 43 75  loadChecked(BtCu
292b0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
292c0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
292d0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
292e0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
292f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
29300 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 75  {.    assert( cu
29310 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
29320 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20 72 65  (pCur) );.    re
29330 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
29340 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
29350 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a   amt, pBuf, 0);.
29360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
29370 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  urn accessPayloa
29380 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c 20 6f  dChecked(pCur, o
29390 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
293a0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
293b0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
293c0 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a  NCRBLOB */../*.*
293d0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
293e0 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e  er to payload in
293f0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
29400 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
29410 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f  e .** pCur curso
29420 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
29430 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69  .  The pointer i
29440 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  s to the beginni
29450 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79  ng of.** the key
29460 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65 73   if index btrees
29470 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d   (pPage->intKey=
29480 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20 64  =0) and is the d
29490 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65  ata for.** table
294a0 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e   btrees (pPage->
294b0 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20  intKey==1). The 
294c0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
294d0 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  of available.** 
294e0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
294f0 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  ten into *pAmt. 
29500 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
29510 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20  en the value.** 
29520 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
29530 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69  t be a valid poi
29540 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
29550 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
29560 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
29570 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
29580 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
29590 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
295a0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
295b0 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
295c0 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
295d0 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
295e0 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
295f0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
29600 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
29610 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
29620 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
29630 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
29640 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
29650 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
29660 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
29670 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
29680 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
29690 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
296a0 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  ble.** the key/d
296b0 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
296c0 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
296d0 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
296e0 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
296f0 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
29700 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
29710 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
29720 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
29730 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
29740 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
29750 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
29760 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
29770 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
29780 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
29790 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64  tatic const void
297a0 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a   *fetchPayload(.
297b0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
297c0 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72  ,      /* Cursor
297d0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74   pointing to ent
297e0 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  ry to read from 
297f0 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20  */.  u32 *pAmt  
29800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
29810 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
29820 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
29830 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
29840 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28  t amt;.  assert(
29850 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75 72   pCur!=0 && pCur
29860 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
29870 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 61 73  ur->pPage);.  as
29880 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
29890 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
298a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
298b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
298c0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
298d0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
298e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
298f0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
29900 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29910 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67  r->ix<pCur->pPag
29920 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
29930 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29940 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73  .nSize>0 );.  as
29950 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f  sert( pCur->info
29960 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e  .pPayload>pCur->
29970 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
29980 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
29990 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
299a0 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43 75 72  fo.pPayload<pCur
299b0 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ->pPage->aDataEn
299c0 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42 29 3b  d ||CORRUPT_DB);
299d0 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69  .  amt = pCur->i
299e0 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 69 66  nfo.nLocal;.  if
299f0 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43 75 72  ( amt>(int)(pCur
29a00 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e  ->pPage->aDataEn
29a10 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d - pCur->info.p
29a20 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20 20 20  Payload) ){.    
29a30 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f 6f 20  /* There is too 
29a40 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f 6e 20  little space on 
29a50 74 68 65 20 70 61 67 65 20 66 6f 72 20 74 68 65  the page for the
29a60 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75 6e 74   expected amount
29a70 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63 61 6c  .    ** of local
29a80 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61 62 61   content. Databa
29a90 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
29aa0 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  pt. */.    asser
29ab0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  t( CORRUPT_DB );
29ac0 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58 28 30  .    amt = MAX(0
29ad0 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50  , (int)(pCur->pP
29ae0 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  age->aDataEnd - 
29af0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
29b00 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 41  oad));.  }.  *pA
29b10 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b 0a 20  mt = (u32)amt;. 
29b20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70   return (void*)p
29b30 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
29b40 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
29b50 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
29b60 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
29b70 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
29b80 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
29b90 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
29ba0 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
29bb0 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
29bc0 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
29bd0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
29be0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
29bf0 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
29c00 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
29c10 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
29c20 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
29c30 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
29c40 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
29c50 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
29c60 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
29c70 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
29c80 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
29c90 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
29ca0 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
29cb0 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
29cc0 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
29cd0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
29ce0 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
29cf0 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
29d00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
29d10 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
29d20 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
29d30 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
29d40 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
29d50 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
29d60 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
29d70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
29d80 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
29d90 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
29da0 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63 68 28  reePayloadFetch(
29db0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29dc0 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72 65  u32 *pAmt){.  re
29dd0 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f 61  turn fetchPayloa
29de0 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a 7d  d(pCur, pAmt);.}
29df0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
29e00 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
29e10 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
29e20 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
29e30 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
29e40 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
29e50 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
29e60 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a   to move to..**.
29e70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29e80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29e90 43 4f 52 52 55 50 54 20 69 66 20 74 68 65 20 70  CORRUPT if the p
29ea0 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
29eb0 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74 68 65   field of.** the
29ec0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
29ed0 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
29ee0 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  he flags field o
29ef0 66 20 74 68 65 20 70 61 72 65 6e 74 20 28 69 2e  f the parent (i.
29f00 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e 74 6b  e..** if an intk
29f10 65 79 20 70 61 67 65 20 61 70 70 65 61 72 73 20  ey page appears 
29f20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65 6e 74  to be the parent
29f30 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   of a non-intkey
29f40 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76 69 63   page, or.** vic
29f50 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73 74 61  e-versa)..*/.sta
29f60 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
29f70 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
29f80 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
29f90 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
29fa0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a  t = pCur->pBt;..
29fb0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29fc0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29fd0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29fe0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29ff0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a000 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2a010 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
2a020 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
2a030 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
2a040 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  =0 );.  if( pCur
2a050 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55 52 53  ->iPage>=(BTCURS
2a060 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31 29 20  OR_MAX_DEPTH-1) 
2a070 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2a080 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2a090 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69  T;.  }.  pCur->i
2a0a0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2a0b0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a0c0 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
2a0d0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2a0e0 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  fl);.  pCur->aiI
2a0f0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2a100 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 70 43  = pCur->ix;.  pC
2a110 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2a120 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72 2d 3e  >iPage] = pCur->
2a130 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69  pPage;.  pCur->i
2a140 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2a150 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  Page++;.  return
2a160 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2a170 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
2a180 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72  Cur->pPage, pCur
2a190 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
2a1a0 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 64 65  Flags);.}..#ifde
2a1b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
2a1c0 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72 65 6e  *.** Page pParen
2a1d0 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  t is an internal
2a1e0 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65   (non-leaf) tree
2a1f0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
2a200 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73  tion .** asserts
2a210 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
2a220 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
2a230 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20 74 68  left-child if th
2a240 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c  e iIdx'th.** cel
2a250 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72 65 6e  l in page pParen
2a260 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78 20 69  t. Or, if iIdx i
2a270 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 74  s equal to the t
2a280 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a  otal number of.*
2a290 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  * cells in pPare
2a2a0 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20 6e 75  nt, that page nu
2a2b0 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74  mber iChild is t
2a2c0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
2a2d0 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a  f.** the page..*
2a2e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73  /.static void as
2a2f0 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a300 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
2a310 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f  , int iIdx, Pgno
2a320 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66 28 20   iChild){.  if( 
2a330 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
2a340 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e  urn;  /* The con
2a350 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64 20 62  ditions tested b
2a360 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74 20 62  elow might not b
2a370 65 20 74 72 75 65 0a 20 20 20 20 20 20 20 20 20  e true.         
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75     ** in a corru
2a3a0 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  pt database */. 
2a3b0 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
2a3c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
2a3d0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
2a3e0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
2a3f0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2a400 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
2a410 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
2a420 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
2a430 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
2a440 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
2a450 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2a460 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
2a470 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
2a480 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
2a490 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a4a0 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
2a4b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2a4c0 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
2a4d0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
2a4e0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
2a4f0 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
2a500 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
2a510 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
2a520 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
2a530 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
2a540 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
2a550 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
2a560 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
2a570 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
2a580 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
2a590 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
2a5a0 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
2a5b0 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  l index..*/.stat
2a5c0 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61  ic void moveToPa
2a5d0 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70  rent(BtCursor *p
2a5e0 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  Cur){.  MemPage 
2a5f0 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65 72 74  *pLeaf;.  assert
2a600 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2a610 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2a620 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2a630 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2a640 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2a650 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
2a660 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2a670 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  >pPage );.  asse
2a680 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20  rtParentIndex(. 
2a690 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b     pCur->apPage[
2a6a0 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
2a6b0 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2a6c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
2a6d0 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67   .    pCur->pPag
2a6e0 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  e->pgno.  );.  t
2a6f0 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
2a700 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a710 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
2a720 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
2a730 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
2a740 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2a750 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2a760 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2a770 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2a780 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
2a790 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61 69 49  ->ix = pCur->aiI
2a7a0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2a7b0 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70 43 75  ];.  pLeaf = pCu
2a7c0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72  r->pPage;.  pCur
2a7d0 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  ->pPage = pCur->
2a7e0 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d 3e 69  apPage[--pCur->i
2a7f0 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61 73 65  Page];.  release
2a800 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c 65 61  PageNotNull(pLea
2a810 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  f);.}../*.** Mov
2a820 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2a830 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
2a840 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
2a850 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
2a860 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
2a870 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
2a880 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
2a890 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
2a8a0 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
2a8b0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
2a8c0 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
2a8d0 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
2a8e0 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
2a8f0 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
2a900 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
2a910 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
2a920 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
2a930 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
2a940 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
2a950 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
2a960 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
2a970 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
2a980 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
2a990 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
2a9a0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
2a9b0 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
2a9c0 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
2a9d0 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
2a9e0 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74  ID and this rout
2a9f0 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
2aa00 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65 72 77  TE_EMPTY. Otherw
2aa10 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75 72 73  ise,.** the curs
2aa20 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
2aa30 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  nt to the first 
2aa40 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20  cell located on 
2aa50 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f 72 20  the root.** (or 
2aa60 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
2aa70 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
2aa80 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2aa90 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a  o CURSOR_VALID..
2aaa0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
2aab0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73  nction returns s
2aac0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20  uccessfully, it 
2aad0 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74  may be assumed t
2aae0 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d  hat the.** page-
2aaf0 68 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64  header flags ind
2ab00 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b  icate that the [
2ab10 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61  virtual] root-pa
2ab20 67 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74  ge is the expect
2ab30 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62  ed .** kind of b
2ab40 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e  -tree page (i.e.
2ab50 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67   if when opening
2ab60 20 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20   the cursor the 
2ab70 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a  caller did not.*
2ab80 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  * specify a KeyI
2ab90 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
2aba0 65 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20  e flags byte is 
2abb0 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30  set to 0x05 or 0
2abc0 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69  x0D,.** indicati
2abd0 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ng a table b-tre
2abe0 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c  e, or if the cal
2abf0 6c 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20  ler did specify 
2ac00 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74  a KeyInfo .** st
2ac10 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2ac20 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2ac30 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69   0x02 or 0x0A, i
2ac40 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64  ndicating an ind
2ac50 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a  ex.** b-tree)..*
2ac60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
2ac70 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72  eToRoot(BtCursor
2ac80 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2ac90 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74  ge *pRoot;.  int
2aca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2acb0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2acc0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2acd0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2ace0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2acf0 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
2ad00 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
2ad10 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
2ad20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
2ad30 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
2ad40 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
2ad50 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
2ad60 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2ad70 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ad80 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e < CURSOR_REQUI
2ad90 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72 2d 3e  RESEEK || pCur->
2ada0 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61 73 73  iPage<0 );.  ass
2adb0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2adc0 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d 3e 69  oot>0 || pCur->i
2add0 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69 66 28  Page<0 );..  if(
2ade0 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
2adf0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
2ae00 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
2ae10 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
2ae20 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b  ll(pCur->pPage);
2ae30 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d 2d  .      while( --
2ae40 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20  pCur->iPage ){. 
2ae50 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
2ae60 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
2ae70 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ae80 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ge]);.      }.  
2ae90 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
2aea0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
2aeb0 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b  ];.      goto sk
2aec0 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20  ip_init;.    }. 
2aed0 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d   }else if( pCur-
2aee0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a  >pgnoRoot==0 ){.
2aef0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2af00 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2af10 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
2af20 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 65  LITE_EMPTY;.  }e
2af30 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2af40 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
2af50 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  1) );.    if( pC
2af60 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
2af70 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
2af80 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2af90 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2afa0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
2afb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2afc0 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45  skipNext!=SQLITE
2afd0 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 72  _OK );.        r
2afe0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2aff0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
2b000 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
2b010 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75 72  ClearCursor(pCur
2b020 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  );.    }.    rc 
2b030 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
2b040 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
2b050 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
2b060 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
2b070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b080 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75            0, pCu
2b090 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
2b0a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2b0b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b0c0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b0d0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2b0e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2b0f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2b100 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->iPage = 0;.   
2b110 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79   pCur->curIntKey
2b120 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   = pCur->pPage->
2b130 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52  intKey;.  }.  pR
2b140 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
2b150 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  e;.  assert( pRo
2b160 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e  ot->pgno==pCur->
2b170 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f  pgnoRoot );..  /
2b180 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49  * If pCur->pKeyI
2b190 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  nfo is not NULL,
2b1a0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
2b1b0 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69   that opened thi
2b1c0 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78  s cursor.  ** ex
2b1d0 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69  pected to open i
2b1e0 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d  t on an index b-
2b1f0 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  tree. Otherwise,
2b200 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a   if pKeyInfo is.
2b210 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63    ** NULL, the c
2b220 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20  aller expects a 
2b230 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66  table b-tree. If
2b240 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
2b250 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75   case,.  ** retu
2b260 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52  rn an SQLITE_COR
2b270 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a  RUPT error. .  *
2b280 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76  *.  ** Earlier v
2b290 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
2b2a0 65 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  e assumed that t
2b2b0 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e  his test could n
2b2c0 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20  ot fail.  ** if 
2b2d0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61  the root page wa
2b2e0 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64  s already loaded
2b2f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2b300 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28  ion was called (
2b310 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75  i.e..  ** if pCu
2b320 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75  r->iPage>=0). Bu
2b330 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f  t this is not so
2b340 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
2b350 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20   is corrupted . 
2b360 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61   ** in such a wa
2b370 79 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f  y that page pRoo
2b380 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f  t is linked into
2b390 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65   a second b-tree
2b3a0 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72   table .  ** (or
2b3b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20   the freelist). 
2b3c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52   */.  assert( pR
2b3d0 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c  oot->intKey==1 |
2b3e0 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d  | pRoot->intKey=
2b3f0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f  =0 );.  if( pRoo
2b400 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20  t->isInit==0 || 
2b410 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d  (pCur->pKeyInfo=
2b420 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b  =0)!=pRoot->intK
2b430 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ey ){.    return
2b440 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2b450 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61 67 65  PAGE(pCur->pPage
2b460 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69  );.  }..skip_ini
2b470 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69 78 20  t:  .  pCur->ix 
2b480 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  = 0;.  pCur->inf
2b490 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2b4a0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2b4b0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2b4c0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2b4d0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a  CF_ValidOvfl);..
2b4e0 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e    pRoot = pCur->
2b4f0 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70 52 6f  pPage;.  if( pRo
2b500 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20  ot->nCell>0 ){. 
2b510 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b520 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a  = CURSOR_VALID;.
2b530 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f    }else if( !pRo
2b540 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ot->leaf ){.    
2b550 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20  Pgno subpage;.  
2b560 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e    if( pRoot->pgn
2b570 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  o!=1 ) return SQ
2b580 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b590 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d  T;.    subpage =
2b5a0 20 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74   get4byte(&pRoot
2b5b0 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68  ->aData[pRoot->h
2b5c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2b5d0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2b5e0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
2b5f0 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2b600 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
2b610 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2b620 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2b630 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2b640 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2b650 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72 65 74  EMPTY;.  }.  ret
2b660 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2b670 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2b680 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
2b690 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
2b6a0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
2b6b0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2b6c0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
2b6d0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
2b6e0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
2b6f0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
2b700 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
2b710 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
2b720 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
2b730 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2b740 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
2b750 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
2b760 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
2b770 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b780 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2b790 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2b7a0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2b7b0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2b7c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b7d0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b7e0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
2b7f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b800 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
2b810 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
2b820 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b830 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e  Cur->ix<pPage->n
2b840 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f  Cell );.    pgno
2b850 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64   = get4byte(find
2b860 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2b870 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->ix));.    rc =
2b880 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
2b890 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20  r, pgno);.  }.  
2b8a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b8b0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
2b8c0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
2b8d0 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
2b8e0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2b8f0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69  e.** page to whi
2b900 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
2b910 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f  ly pointing.  No
2b920 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65  tice the differe
2b930 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d  nce.** between m
2b940 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20  oveToLeftmost() 
2b950 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  and moveToRightm
2b960 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65  ost().  moveToLe
2b970 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  ftmost().** find
2b980 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  s the left-most 
2b990 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
2b9a0 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61  e *entry* wherea
2b9b0 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  s moveToRightmos
2b9c0 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
2b9d0 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
2b9e0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70  y beneath the *p
2b9f0 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  age*..**.** The 
2ba00 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
2ba10 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68   is the one with
2ba20 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79   the largest key
2ba30 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b   - the last.** k
2ba40 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ey in ascending 
2ba50 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
2ba60 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74   int moveToRight
2ba70 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  most(BtCursor *p
2ba80 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e  Cur){.  Pgno pgn
2ba90 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  o;.  int rc = SQ
2baa0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2bab0 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
2bac0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
2bad0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
2bae0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2baf0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2bb00 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2bb10 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20 3d  while( !(pPage =
2bb20 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c   pCur->pPage)->l
2bb30 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
2bb40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
2bb50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2bb60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
2bb70 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 70 50     pCur->ix = pP
2bb80 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
2bb90 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2bba0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
2bbb0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2bbc0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72  n rc;.  }.  pCur
2bbd0 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  ->ix = pPage->nC
2bbe0 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28  ell-1;.  assert(
2bbf0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2bc00 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e==0 );.  assert
2bc10 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2bc20 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b  s & BTCF_ValidNK
2bc30 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ey)==0 );.  retu
2bc40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2bc50 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
2bc60 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
2bc70 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2bc80 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2bc90 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2bca0 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2bcb0 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2bcc0 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2bcd0 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2bce0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2bcf0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2bd00 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2bd10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2bd20 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
2bd30 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2bd40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
2bd50 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2bd60 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2bd70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2bd80 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2bd90 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2bda0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
2bdb0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
2bdc0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
2bdd0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bde0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2bdf0 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  age->nCell>0 );.
2be00 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2be10 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
2be20 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
2be30 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
2be40 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20  LITE_EMPTY ){.  
2be50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2be60 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2be70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2be80 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65  l==0 );.    *pRe
2be90 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20  s = 1;.    rc = 
2bea0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2beb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2bec0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2bed0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  on is a no-op if
2bee0 20 63 75 72 73 6f 72 20 70 43 75 72 20 64 6f 65   cursor pCur doe
2bef0 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  s not point to a
2bf00 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a 20 4f   valid row..** O
2bf10 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43 75  therwise, if pCu
2bf20 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f 6e 66  r is valid, conf
2bf30 69 67 75 72 65 20 69 74 20 73 6f 20 74 68 61 74  igure it so that
2bf40 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
2bf50 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  o.** sqlite3Btre
2bf60 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e 6f 2d  eNext() is a no-
2bf70 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  op..*/.#ifndef S
2bf80 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
2bf90 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c 69 74  WFUNC.void sqlit
2bfa0 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78 74 28  e3BtreeSkipNext(
2bfb0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2bfc0 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65 76 65  .  /* We believe
2bfd0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
2bfe0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
2bff0 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73 74 61  in the valid sta
2c000 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 69  te when.  ** thi
2c010 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
2c020 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70 72 6f  led, but the pro
2c030 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c 74 2c  of is difficult,
2c040 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a 20 20   so we add an.  
2c050 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65 73 74  ** ALWaYS() test
2c060 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 77 65   just in case we
2c070 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f 0a 20   are wrong. */. 
2c080 20 69 66 28 20 41 4c 57 41 59 53 28 70 43 75 72   if( ALWAYS(pCur
2c090 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2c0a0 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20 20 70  _VALID) ){.    p
2c0b0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2c0c0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b 0a 20  RSOR_SKIPNEXT;. 
2c0d0 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
2c0e0 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  t = 1;.  }.}.#en
2c0f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
2c100 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20 2a 2f  IT_WINDOWFUNC */
2c110 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2c120 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2c130 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2c140 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2c150 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2c160 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2c170 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2c180 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2c190 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2c1a0 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2c1b0 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2c1c0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2c1d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c1e0 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2c1f0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2c200 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2c210 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2c220 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2c230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2c240 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2c250 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2c260 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2c270 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2c280 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2c290 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2c2a0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2c2b0 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2c2c0 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2c2d0 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2c2e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2c2f0 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2c300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2c310 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2c320 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2c330 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2c340 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2c350 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2c360 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2c370 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2c380 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2c390 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2c3a0 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2c3b0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2c3c0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2c3d0 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2c3e0 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2c3f0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2c400 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70 43 75  t( pCur->ix==pCu
2c410 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d  r->pPage->nCell-
2c420 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
2c430 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65   pCur->pPage->le
2c440 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  af );.#endif.   
2c450 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c460 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  K;.  }..  rc = m
2c470 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2c480 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2c490 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
2c4a0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2c4b0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
2c4c0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2c4d0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2c4e0 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2c4f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2c500 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c510 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2c520 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2c530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c540 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2c550 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a  = ~BTCF_AtLast;.
2c560 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2c570 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d 50  ( rc==SQLITE_EMP
2c580 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  TY ){.    assert
2c590 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2c5a0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61  ==0 || pCur->pPa
2c5b0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
2c5c0 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2c5d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c5e0 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
2c5f0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2c600 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2c610 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2c620 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2c630 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2c640 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2c650 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2c660 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2c670 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2c680 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2c690 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2c6a0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2c6b0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2c6c0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2c6d0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2c6e0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2c6f0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2c700 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2c710 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2c720 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2c730 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2c740 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2c750 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2c760 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2c770 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2c780 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2c790 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2c7a0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2c7b0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2c7c0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2c7d0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2c7e0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2c7f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2c800 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2c810 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2c820 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2c830 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2c840 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2c850 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2c860 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2c870 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2c880 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2c890 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2c8a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2c8b0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2c8c0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2c8d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c8e0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2c8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2c900 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2c910 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2c920 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c930 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2c940 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2c950 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2c960 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2c970 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2c980 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2c990 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2c9a0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2c9b0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2c9c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2c9d0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2c9e0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2c9f0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2ca00 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2ca10 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2ca20 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2ca30 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2ca50 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2ca60 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2ca70 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2ca80 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2ca90 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2caa0 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2cab0 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2cac0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2cad0 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2cae0 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2caf0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2cb00 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2cb10 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2cb20 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2cb30 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2cb40 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2cb50 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2cb60 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2cb70 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2cb80 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2cb90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cba0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2cbb0 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2cbc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2cbd0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2cbe0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2cbf0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2cc00 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2cc10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2cc20 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2cc30 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2cc40 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2cc50 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2cc60 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2cc70 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2cc80 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2cc90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2cca0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2ccb0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2ccc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2ccd0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2cce0 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2ccf0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2cd00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2cd10 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2cd20 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64  OR_VALID || (pId
2cd30 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d  xKey==0)==(pCur-
2cd40 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29  >curIntKey!=0) )
2cd50 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  ;..  /* If the c
2cd60 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
2cd70 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74   positioned at t
2cd80 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20  he point we are 
2cd90 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d  trying.  ** to m
2cda0 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73  ove to, then jus
2cdb0 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  t return without
2cdc0 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20   doing any work 
2cdd0 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79  */.  if( pIdxKey
2cde0 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e  ==0.   && pCur->
2cdf0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2ce00 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63  ALID && (pCur->c
2ce10 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
2ce20 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29  alidNKey)!=0.  )
2ce30 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2ce40 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2ce50 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2ce60 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2ce70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ce80 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72    }.    if( pCur
2ce90 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b  ->info.nKey<intK
2cea0 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ey ){.      if( 
2ceb0 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2cec0 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21 3d  & BTCF_AtLast)!=
2ced0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52  0 ){.        *pR
2cee0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  es = -1;.       
2cef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cf00 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2cf10 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71 75 65   /* If the reque
2cf20 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e 65 20  sted key is one 
2cf30 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20 70 72  more than the pr
2cf40 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68 65 6e  evious key, then
2cf50 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20 74 6f  .      ** try to
2cf60 20 67 65 74 20 74 68 65 72 65 20 75 73 69 6e 67   get there using
2cf70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2cf80 74 28 29 20 72 61 74 68 65 72 20 74 68 61 6e 20  t() rather than 
2cf90 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a full.      ** 
2cfa0 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
2cfb0 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
2cfc0 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20 20 54  ization only.  T
2cfd0 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73 77 65  he correct answe
2cfe0 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74  r.      ** is st
2cff0 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77 69 74  ill obtained wit
2d000 68 6f 75 74 20 74 68 69 73 20 63 61 73 65 2c 20  hout this case, 
2d010 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20 6d 6f  only a little mo
2d020 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a 20 20  re slowely */.  
2d030 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2d040 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74 4b 65  fo.nKey+1==intKe
2d050 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b 69 70  y && !pCur->skip
2d060 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
2d070 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2d080 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2d090 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2d0a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2d0b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d0c0 20 20 20 20 20 20 20 20 20 20 67 65 74 43 65 6c            getCel
2d0d0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
2d0e0 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d         if( pCur-
2d0f0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
2d100 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ey ){.          
2d110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d120 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2d130 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2d140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
2d150 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
2d160 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d170 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2d180 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2d190 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
2d1a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2d1b0 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2d1c0 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2d1d0 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2d1e0 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2d1f0 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2d200 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2d210 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2d220 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2d230 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2d240 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2d250 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2d260 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2d270 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2d280 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2d290 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2d2a0 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2d2b0 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2d2c0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2d2d0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2d2e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
2d2f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 4d  f( rc==SQLITE_EM
2d300 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61 73 73  PTY ){.      ass
2d310 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2d320 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2d330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2d340 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
2d350 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2d360 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2d370 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
2d380 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2d390 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20  pCur->pPage );. 
2d3a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2d3b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d3c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d3d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2d3e0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2d3f0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2d400 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20 61 73  Cell > 0 );.  as
2d410 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
2d420 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  e==0 || pCur->ap
2d430 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2d440 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2d450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2d460 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2d470 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2d480 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2d490 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2d4a0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2d4b0 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2d4c0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2d4d0 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  ge;.    u8 *pCel
2d4e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2d4f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2d500 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2d510 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2d520 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2d530 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2d540 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2d550 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2d560 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2d570 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2d580 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2d590 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2d5a0 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2d5b0 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2d5c0 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2d5d0 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2d5e0 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2d5f0 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2d600 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2d610 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2d620 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2d630 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2d640 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2d650 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2d660 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2d670 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2d680 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2d690 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2d6a0 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2d6b0 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2d6c0 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2d6d0 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2d6e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2d6f0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2d700 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2d710 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2d720 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2d730 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2d740 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2d750 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2d760 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2d770 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2d780 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2d790 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2d7a0 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2d7b0 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2d7c0 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28      pCur->ix = (
2d7d0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2d7e0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2d7f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2d800 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2d810 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2d820 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2d830 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2d840 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2d850 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d860 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2d870 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2d880 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2d890 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2d8a0 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2d8b0 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ataEnd ){.      
2d8c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d8d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2d8e0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2d8f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2d910 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2d920 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2d930 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2d940 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2d950 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2d960 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2d970 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2d980 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2d990 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2d9a0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2d9b0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2d9c0 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2d9d0 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2d9e0 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2d9f0 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2da00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2da10 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2da20 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2da30 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2da40 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2da50 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2da60 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2da70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2da80 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2da90 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2daa0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2dab0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2dac0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2dad0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2dae0 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2daf0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2db00 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2db10 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2db20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2db30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2db40 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2db50 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2db60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2db70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2db80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2db90 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2dba0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2dbb0 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2dbc0 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2dbd0 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2dbe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2dbf0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2dc00 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2dc10 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2dc20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2dc30 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2dc40 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2dc50 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2dc60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2dc70 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2dc80 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2dc90 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2dca0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2dcb0 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2dcc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2dcd0 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2dce0 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2dcf0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2dd00 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2dd10 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2dd20 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2dd30 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2dd40 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2dd50 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2dd60 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2dd70 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2dd80 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2dd90 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2dda0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2ddb0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2ddc0 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2ddd0 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2dde0 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2ddf0 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2de00 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2de10 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2de20 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2de30 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2de40 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2de50 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2de60 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2de70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2de80 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2de90 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2dea0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2deb0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2dec0 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2ded0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2dee0 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2def0 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2df00 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2df10 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2df20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2df30 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2df40 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2df50 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2df60 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2df70 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2df80 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2df90 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2dfa0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2dfb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2dfc0 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2dfd0 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2dfe0 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2dff0 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2e000 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2e010 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2e020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2e030 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2e040 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2e050 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2e060 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2e070 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2e080 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2e090 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2e0a0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2e0b0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2e0c0 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2e0d0 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2e0e0 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2e0f0 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2e100 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2e110 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2e120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2e130 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2e140 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2e150 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2e160 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2e170 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2e180 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2e190 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2e1a0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2e1b0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2e1c0 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2e1d0 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2e1e0 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2e1f0 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2e200 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2e210 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2e220 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2e230 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2e240 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2e250 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2e260 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2e270 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2e280 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2e290 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2e2a0 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2e2b0 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2e2c0 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2e2d0 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2e2e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2e2f0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2e300 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2e310 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2e320 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2e330 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2e340 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2e350 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2e360 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2e370 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2e380 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2e390 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2e3a0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2e3b0 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2e3c0 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2e3d0 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2e3e0 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2e3f0 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2e400 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2e410 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2e420 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2e430 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2e440 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2e450 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2e460 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2e470 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2e480 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2e490 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2e4a0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2e4b0 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2e4c0 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2e4d0 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2e4e0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2e4f0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2e500 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2e510 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2e520 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2e530 66 28 20 6e 43 65 6c 6c 3c 32 20 7c 7c 20 6e 43  f( nCell<2 || nC
2e540 65 6c 6c 2f 70 43 75 72 2d 3e 70 42 74 2d 3e 75  ell/pCur->pBt->u
2e550 73 61 62 6c 65 53 69 7a 65 3e 70 43 75 72 2d 3e  sableSize>pCur->
2e560 70 42 74 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20  pBt->nPage ){.  
2e570 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2e580 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
2e590 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
2e5a0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2e5b0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2e5c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e5d0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69   pCellKey = sqli
2e5e0 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c  te3Malloc( nCell
2e5f0 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20 20 20  +18 );.         
2e600 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30   if( pCellKey==0
2e610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2e630 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2e640 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2e650 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2e660 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2e670 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64  ur->ix = (u16)id
2e680 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  x;.          rc 
2e690 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
2e6a0 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20  pCur, 0, nCell, 
2e6b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e6c0 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a 20 20  pCellKey, 0);.  
2e6d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2e6e0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2e6f0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
2e700 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2e710 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e720 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2e730 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2e740 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2e750 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2e760 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2e770 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2e780 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2e790 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2e7a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2e7b0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2e7c0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2e7d0 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2e7e0 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2e7f0 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2e800 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2e810 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2e820 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e830 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2e840 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2e850 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2e860 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2e870 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2e880 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2e890 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2e8a0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2e8b0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2e8c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2e8d0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e8e0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2e8f0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2e900 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2e910 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
2e920 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2e930 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2e940 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2e950 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2e960 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2e970 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2e980 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2e990 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e9a0 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2e9b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2e9c0 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2e9d0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2e9e0 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2e9f0 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2ea00 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2ea10 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2ea20 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2ea30 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2ea40 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2ea50 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ea60 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2ea70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2ea80 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2ea90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70  sert( pCur->ix<p
2eaa0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2eab0 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  l );.      pCur-
2eac0 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  >ix = (u16)idx;.
2ead0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b        *pRes = c;
2eae0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2eaf0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74  TE_OK;.      got
2eb00 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2eb10 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65  .    }.moveto_ne
2eb20 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66  xt_layer:.    if
2eb30 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43  ( lwr>=pPage->nC
2eb40 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  ell ){.      chl
2eb50 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26  dPg = get4byte(&
2eb60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2eb70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2eb80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2eb90 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74      chldPg = get
2eba0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2ebb0 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20  Page, lwr));.   
2ebc0 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20   }.    pCur->ix 
2ebd0 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20  = (u16)lwr;.    
2ebe0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2ebf0 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a  (pCur, chldPg);.
2ec00 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65      if( rc ) bre
2ec10 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66  ak;.  }.moveto_f
2ec20 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69  inish:.  pCur->i
2ec30 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2ec40 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2ec50 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2ec60 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2ec70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ec80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2ec90 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
2eca0 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2ecb0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
2ecc0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
2ecd0 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
2ece0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
2ecf0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
2ed00 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
2ed10 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
2ed20 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
2ed30 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
2ed40 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
2ed50 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
2ed60 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
2ed70 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
2ed80 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
2ed90 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
2eda0 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
2edb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2edc0 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
2edd0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
2ede0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
2edf0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
2ee00 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
2ee10 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
2ee20 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
2ee30 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
2ee40 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
2ee50 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
2ee60 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
2ee70 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
2ee80 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
2ee90 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
2eea0 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
2eeb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2eec0 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20  an estimate for 
2eed0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
2eee0 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  ws in the table 
2eef0 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
2ef00 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65  pointing to.  Re
2ef10 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
2ef20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74  number if no est
2ef30 69 6d 61 74 65 20 69 73 20 63 75 72 72 65 6e 74  imate is current
2ef40 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ly .** available
2ef50 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
2ef60 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74  BtreeRowCountEst
2ef70 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ef80 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20  {.  i64 n;.  u8 
2ef90 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  i;..  assert( cu
2efa0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2efb0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2efc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2efd0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2efe0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2eff0 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74  );..  /* Current
2f000 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66 61 63  ly this interfac
2f010 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
2f020 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61   by the OP_IfSma
2f030 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65  ller.  ** opcode
2f040 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20 63 61  , and it that ca
2f050 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77 69  se the cursor wi
2f060 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c  ll always be val
2f070 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c  id and.  ** will
2f080 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f   always point to
2f090 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f   a leaf node. */
2f0a0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 43 75  .  if( NEVER(pCu
2f0b0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f0c0 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74 75 72  R_VALID) ) retur
2f0d0 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45  n -1;.  if( NEVE
2f0e0 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c  R(pCur->pPage->l
2f0f0 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  eaf==0) ) return
2f100 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72   -1;..  n = pCur
2f110 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  ->pPage->nCell;.
2f120 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75    for(i=0; i<pCu
2f130 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
2f140 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61      n *= pCur->a
2f150 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b  pPage[i]->nCell;
2f160 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
2f170 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
2f180 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
2f190 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  the next entry i
2f1a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
2f1b0 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65  .** Return value
2f1c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54  :.**.**    SQLIT
2f1d0 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63  E_OK        succ
2f1e0 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45  ess.**    SQLITE
2f1f0 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f  _DONE      curso
2f200 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
2f210 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73  nting at the las
2f220 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20  t element.**    
2f230 6f 74 68 65 72 77 69 73 65 20 20 20 20 20 20 20  otherwise       
2f240 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72   some kind of er
2f250 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a  ror occurred.**.
2f260 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2f270 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2f280 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20  e3BtreeNext().  
2f290 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20  That routine is 
2f2a0 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72  optimized.** for
2f2b0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2f2c0 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65   of merely incre
2f2d0 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c  menting the cell
2f2e0 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f   counter BtCurso
2f2f0 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68  r.aiIdx.** to th
2f300 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74  e next cell on t
2f310 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
2f320 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
2f330 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65  treeNext() helpe
2f340 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  r.** routine is 
2f350 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69  called when it i
2f360 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d  s necessary to m
2f370 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65  ove to a differe
2f380 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f  nt page or.** to
2f390 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   restore the cur
2f3a0 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69  sor..**.** If bi
2f3b0 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46 20  t 0x01 of the F 
2f3c0 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69  argument in sqli
2f3d0 74 65 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46  te3BtreeNext(C,F
2f3e0 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65  ) is 1, then the
2f3f0 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65  .** cursor corre
2f400 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2f410 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20   index and this 
2f420 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2f430 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70  ve been.** skipp
2f440 65 64 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e  ed if the SQL in
2f450 64 65 78 20 68 61 64 20 62 65 65 6e 20 61 20 75  dex had been a u
2f460 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68  nique index.  Th
2f470 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  e F argument.** 
2f480 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65  is a hint to the
2f490 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c   implement.  SQL
2f4a0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2f4b0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2f4c0 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69  t use.** this hi
2f4d0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
2f4e0 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
2f4f0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2f500 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42 74 43  nt btreeNext(BtC
2f510 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2f520 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
2f530 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
2f540 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
2f550 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2f560 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2f570 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2f580 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2f590 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2f5a0 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28 20 70  VALID );.  if( p
2f5b0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2f5c0 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2f5d0 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2f5e0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2f5f0 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b  ValidOvfl)==0 );
2f600 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72  .    rc = restor
2f610 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2f620 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pCur);.    if( r
2f630 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f640 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2f650 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
2f660 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
2f670 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
2f680 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2f690 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
2f6a0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69     if( pCur->ski
2f6b0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 61  pNext ){.      a
2f6c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2f6d0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2f6e0 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
2f6f0 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
2f700 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72  XT );.      pCur
2f710 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2f720 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 69  R_VALID;.      i
2f730 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2f740 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  t>0 ){.        p
2f750 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20  Cur->skipNext = 
2f760 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
2f770 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f780 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d     }.      pCur-
2f790 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2f7a0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67     }.  }..  pPag
2f7b0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2f7c0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2f7d0 3e 69 78 3b 0a 20 20 69 66 28 20 21 70 50 61 67  >ix;.  if( !pPag
2f7e0 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
2f7f0 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f   /* The only kno
2f800 77 6e 20 77 61 79 20 66 6f 72 20 74 68 69 73 20  wn way for this 
2f810 74 6f 20 68 61 70 70 65 6e 20 69 73 20 66 6f 72  to happen is for
2f820 20 74 68 65 72 65 20 74 6f 20 62 65 20 61 0a 20   there to be a. 
2f830 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20     ** recursive 
2f840 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  SQL function tha
2f850 74 20 64 6f 65 73 20 61 20 44 45 4c 45 54 45 20  t does a DELETE 
2f860 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 70 61 72  operation as par
2f870 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20 53 45  t of a.    ** SE
2f880 4c 45 43 54 20 77 68 69 63 68 20 64 65 6c 65 74  LECT which delet
2f890 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74 20 66  es content out f
2f8a0 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61 63 74  rom under an act
2f8b0 69 76 65 20 63 75 72 73 6f 72 0a 20 20 20 20 2a  ive cursor.    *
2f8c0 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64  * in a corrupt d
2f8d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
2f8e0 72 65 20 74 68 65 20 74 61 62 6c 65 20 62 65 69  re the table bei
2f8f0 6e 67 20 44 45 4c 45 54 45 2d 65 64 20 66 72 6f  ng DELETE-ed fro
2f900 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 70 61 67  m.    ** has pag
2f910 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74  es in common wit
2f920 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
2f930 67 20 71 75 65 72 69 65 64 2e 20 20 53 65 65 20  g queried.  See 
2f940 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64 75 6c  TH3.    ** modul
2f950 65 20 63 6f 76 31 2f 62 74 72 65 65 37 38 2e 74  e cov1/btree78.t
2f960 65 73 74 20 74 65 73 74 63 61 73 65 20 32 32 30  est testcase 220
2f970 20 28 32 30 31 38 2d 30 36 2d 30 38 29 20 66 6f   (2018-06-08) fo
2f980 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78 61 6d  r an.    ** exam
2f990 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ple. */.    retu
2f9a0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2f9b0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
2f9c0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
2f9d0 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70  e file is corrup
2f9e0 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  t, it is possibl
2f9f0 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20  e for the value 
2fa00 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20  of idx .  ** to 
2fa10 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72 65 2e  be invalid here.
2fa20 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f   This can only o
2fa30 63 63 75 72 20 69 66 20 61 20 73 65 63 6f 6e 64  ccur if a second
2fa40 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69 65 73   cursor modifies
2fa50 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 77  .  ** the page w
2fa60 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43 75 72  hile cursor pCur
2fa70 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 72 65   is holding a re
2fa80 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e 20 57  ference to it. W
2fa90 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e  hich can.  ** on
2faa0 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74 68 65  ly happen if the
2fab0 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
2fac0 72 75 70 74 20 69 6e 20 73 75 63 68 20 61 20 77  rupt in such a w
2fad0 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68  ay as to link th
2fae0 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f  e.  ** page into
2faf0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62   more than one b
2fb00 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e  -tree structure.
2fb10 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
2fb20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx>pPage->nCell
2fb30 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d   );..  if( idx>=
2fb40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2fb50 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
2fb60 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
2fb70 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2fb80 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
2fb90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2fba0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
2fbb0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2fbc0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2fbd0 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f     return moveTo
2fbe0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2fbf0 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
2fc00 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
2fc10 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
2fc20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2fc30 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2fc40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fc50 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
2fc60 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54     }.      moveT
2fc70 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20  oParent(pCur);. 
2fc80 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75       pPage = pCu
2fc90 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 77  r->pPage;.    }w
2fca0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3e 3d  hile( pCur->ix>=
2fcb0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2fcc0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2fcd0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72  ntKey ){.      r
2fce0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
2fcf0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30 29 3b  eeNext(pCur, 0);
2fd00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2fd10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fd20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
2fd30 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2fd40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2fd50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2fd60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2fd70 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2fd80 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c  );.  }.}.int sql
2fd90 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74  ite3BtreeNext(Bt
2fda0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2fdb0 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65 6d 50  t flags){.  MemP
2fdc0 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 55 4e  age *pPage;.  UN
2fdd0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20  USED_PARAMETER( 
2fde0 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65  flags );  /* Use
2fdf0 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20  d in COMDB2 but 
2fe00 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74  not native SQLit
2fe10 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63  e */.  assert( c
2fe20 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2fe30 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2fe40 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
2fe50 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
2fe60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2fe70 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2fe80 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2fe90 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
2fea0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2feb0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2fec0 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2fed0 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2fee0 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43  dOvfl);.  if( pC
2fef0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2ff00 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2ff10 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2ff20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
2ff30 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20  r->pPage;.  if( 
2ff40 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50  (++pCur->ix)>=pP
2ff50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2ff60 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20    pCur->ix--;.  
2ff70 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2ff80 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20  xt(pCur);.  }.  
2ff90 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2ffa0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2ffb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2ffc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76  {.    return mov
2ffd0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2ffe0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2fff0 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20  Step the cursor 
30000 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74  to the back to t
30010 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
30020 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
30030 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  e..** Return val
30040 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  ues:.**.**     S
30050 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63  QLITE_OK     suc
30060 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  cess.**     SQLI
30070 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75  TE_DONE   the cu
30080 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  rsor is already 
30090 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65  on the first ele
300a0 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
300b0 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69  e.**     otherwi
300c0 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64  se     some kind
300d0 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72   of error occurr
300e0 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69  ed.**.** The mai
300f0 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73  n entry point is
30100 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
30110 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72  vious().  That r
30120 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
30130 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
30140 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
30150 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e  rely decrementin
30160 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
30170 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
30180 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76  x.** to the prev
30190 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65  ious cell on the
301a0 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
301b0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
301c0 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20  eePrevious().** 
301d0 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69  helper routine i
301e0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
301f0 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
30200 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
30210 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20  rent page.** or 
30220 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
30230 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
30240 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
30250 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71  F argument to sq
30260 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
30270 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68  us(C,F) is 1, th
30280 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72  en.** the cursor
30290 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
302a0 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64  an SQL index and
302b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
302c0 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a  uld have been.**
302d0 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20   skipped if the 
302e0 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
302f0 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  en a unique inde
30300 78 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65  x.  The F argume
30310 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20  nt is a.** hint 
30320 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  to the implement
30330 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51  .  The native SQ
30340 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
30350 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
30360 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68  ot.** use this h
30370 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20  int, but COMDB2 
30380 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  does..*/.static 
30390 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
303a0 69 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75  int btreePreviou
303b0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
303c0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
303d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
303e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
303f0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
30400 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
30410 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d  pCur->skipNext==
30420 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  0 || pCur->eStat
30430 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
30440 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
30450 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
30460 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46  BTCF_AtLast|BTCF
30470 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f  _ValidOvfl|BTCF_
30480 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29  ValidNKey))==0 )
30490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
304a0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
304b0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
304c0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
304d0 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LID ){.    rc = 
304e0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
304f0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20  ition(pCur);.   
30500 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30510 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
30520 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30530 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
30540 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
30550 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
30560 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
30570 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
30580 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20  r->skipNext ){. 
30590 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
305a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
305b0 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
305c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
305d0 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20 20 20  SKIPNEXT );.    
305e0 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
305f0 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
30600 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73       if( pCur->s
30610 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20 20 20  kipNext<0 ){.   
30620 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
30630 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ext = 0;.       
30640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30650 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
30660 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
30670 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
30680 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
30690 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28  pPage;.  assert(
306a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
306b0 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
306c0 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74 20  leaf ){.    int 
306d0 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a  idx = pCur->ix;.
306e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
306f0 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62  hild(pCur, get4b
30700 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
30710 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20 20  ge, idx)));.    
30720 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30730 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  rc;.    rc = mov
30740 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75  eToRightmost(pCu
30750 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
30760 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78   while( pCur->ix
30770 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
30780 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
30790 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
307a0 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
307b0 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  _INVALID;.      
307c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
307d0 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DONE;.      }.  
307e0 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74      moveToParent
307f0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
30800 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
30810 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
30820 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
30830 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 28  ur->curFlags & (
30840 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29  BTCF_ValidOvfl))
30850 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75 72  ==0 );..    pCur
30860 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67  ->ix--;.    pPag
30870 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
30880 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
30890 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
308a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
308b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
308c0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
308d0 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
308e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
308f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
30900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
30910 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  t sqlite3BtreePr
30920 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20  evious(BtCursor 
30930 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61 67 73  *pCur, int flags
30940 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
30950 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
30960 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
30970 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66  t( flags==0 || f
30980 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  lags==1 );.  ass
30990 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
309a0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
309b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
309c0 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53 45 44  ALID );.  UNUSED
309d0 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
309e0 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
309f0 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
30a00 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
30a10 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
30a20 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
30a30 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
30a40 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
30a50 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
30a60 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
30a70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
30a80 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
30a90 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
30aa0 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
30ab0 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
30ac0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
30ad0 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20  evious(pCur);.  
30ae0 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
30af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
30b00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
30b10 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
30b20 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
30b30 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
30b40 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
30b50 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
30b60 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
30b70 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
30b80 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
30b90 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
30ba0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
30bb0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
30bc0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
30bd0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
30be0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
30bf0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
30c00 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
30c10 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
30c20 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
30c30 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
30c40 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
30c50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
30c60 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
30c70 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
30c80 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
30c90 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
30ca0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
30cb0 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
30cc0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
30cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
30ce0 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
30cf0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
30d00 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
30d10 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
30d20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
30d30 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
30d40 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
30d50 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
30d60 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
30d70 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
30d80 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
30d90 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
30da0 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
30db0 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
30dc0 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
30dd0 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
30de0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
30df0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
30e00 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
30e10 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
30e20 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
30e30 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
30e40 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
30e50 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
30e60 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
30e70 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
30e80 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
30e90 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
30ea0 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
30eb0 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
30ec0 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
30ed0 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
30ee0 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
30ef0 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
30f00 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
30f10 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
30f20 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
30f30 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
30f40 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
30f50 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
30f60 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
30f70 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
30f80 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
30f90 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
30fa0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
30fb0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
30fc0 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
30fd0 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
30fe0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
30ff0 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
31000 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
31010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
31020 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
31030 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
31040 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
31050 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
31060 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
31070 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
31080 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
31090 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
310a0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
310b0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
310c0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
310d0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
310e0 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
310f0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
31100 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
31110 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
31120 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
31130 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
31140 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
31150 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
31160 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
31170 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31180 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
31190 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
311a0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
311b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
311c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
311d0 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
311e0 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
311f0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
31200 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
31210 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
31220 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
31230 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
31240 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
31250 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
31260 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
31270 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
31280 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
31290 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
312a0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
312b0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
312c0 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
312d0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
312e0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
312f0 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
31300 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
31310 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
31320 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
31330 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
31340 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
31350 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
31360 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
31370 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
31380 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
31390 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
313a0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
313b0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
313c0 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
313d0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
313e0 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
313f0 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
31400 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
31410 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
31420 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
31430 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
31440 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
31450 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
31460 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
31470 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
31480 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
31490 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
314a0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
314b0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
314c0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
314d0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
314e0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
314f0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
31500 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31510 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
31520 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31530 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
31540 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
31550 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
31560 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
31570 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
31580 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31590 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
315a0 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
315b0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
315c0 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
315d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
315e0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
315f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
31600 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
31610 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
31620 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
31630 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31640 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
31650 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31660 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
31670 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
31680 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
31690 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
316a0 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
316b0 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
316c0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
316d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
316e0 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
316f0 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
31700 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
31710 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
31720 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31730 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
31740 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31750 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31760 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
31770 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
31780 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
31790 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
317a0 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
317b0 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
317c0 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
317d0 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
317e0 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
317f0 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
31800 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
31810 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
31820 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
31830 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
31840 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
31850 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
31860 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
31870 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
31880 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
31890 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
318a0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
318b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
318c0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
318d0 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
318e0 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
318f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
31900 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
31910 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
31920 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
31930 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31940 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
31950 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
31960 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
31970 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
31980 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
31990 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
319a0 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
319b0 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
319c0 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
319d0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
319e0 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
319f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
31a00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31a10 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31a20 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
31a30 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
31a40 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
31a50 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
31a60 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
31a70 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
31a80 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
31a90 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
31aa0 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
31ab0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
31ac0 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
31ad0 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
31ae0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
31af0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
31b00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31b10 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
31b20 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
31b30 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
31b40 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
31b50 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
31b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
31b70 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
31b80 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
31b90 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
31ba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31bb0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
31bc0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
31bd0 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
31be0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
31bf0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
31c00 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
31c10 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
31c20 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
31c30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
31c40 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
31c50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
31c60 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
31c70 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
31c80 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
31c90 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
31ca0 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
31cb0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31cc0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
31cd0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
31ce0 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
31cf0 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
31d00 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
31d10 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
31d20 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
31d30 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
31d40 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
31d50 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
31d60 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
31d70 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
31d80 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
31d90 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
31da0 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
31db0 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
31dc0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
31dd0 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
31de0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
31df0 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
31e00 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
31e10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31e20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31e30 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
31e40 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
31e50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
31e60 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
31e70 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
31e80 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
31e90 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
31ea0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
31eb0 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
31ec0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
31ed0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
31ee0 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
31ef0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
31f00 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
31f10 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
31f20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
31f30 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
31f40 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
31f50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
31f60 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
31f70 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
31f80 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
31f90 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
31fa0 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
31fb0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
31fc0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31fd0 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
31fe0 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
31ff0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32000 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
32010 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32020 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
32030 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
32040 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
32050 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
32060 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
32070 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
32080 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
32090 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
320a0 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
320b0 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
320c0 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
320d0 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
320e0 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
320f0 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
32100 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
32110 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
32120 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
32130 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
32140 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
32150 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
32160 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
32170 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32180 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32190 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
321a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
321b0 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
321c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
321d0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
321e0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
321f0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32200 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
32210 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
32220 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
32230 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
32240 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32250 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
32260 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32270 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32280 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
32290 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
322a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
322b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
322c0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
322d0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
322e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
322f0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32300 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32310 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
32320 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
32330 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32350 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
32360 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
32370 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
32380 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
32390 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
323a0 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
323b0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
323c0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
323d0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
323e0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
323f0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
32400 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
32410 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
32420 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
32430 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
32440 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
32450 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
32460 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
32470 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
32480 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32490 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
324a0 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
324b0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
324c0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
324d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
324e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
324f0 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
32500 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
32510 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32520 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
32530 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
32540 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
32550 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32560 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32570 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32580 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
325a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
325b0 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
325c0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
325d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
325e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
325f0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32600 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
32610 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32620 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32630 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
32640 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32650 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32660 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
32670 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32680 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32690 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
326a0 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
326b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
326c0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
326d0 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
326e0 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
326f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
32700 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
32710 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
32720 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
32730 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
32740 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32750 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32760 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
32770 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
32780 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32790 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
327a0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
327b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
327c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
327d0 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
327e0 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
327f0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32800 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
32810 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32820 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32840 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32850 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32860 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
32870 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32890 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
328a0 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
328b0 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
328c0 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
328d0 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
328e0 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
328f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
32900 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
32910 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
32920 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
32930 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
32940 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
32950 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
32960 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32970 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
32980 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
32990 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
329a0 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
329b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
329c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
329d0 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
329e0 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
329f0 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
32a00 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
32a10 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
32a20 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
32a30 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
32a40 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
32a50 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
32a70 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
32a80 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
32a90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
32aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
32ab0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32ac0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
32ad0 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
32ae0 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
32af0 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
32b00 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
32b10 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
32b20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
32b30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
32b40 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
32b50 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
32b60 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
32b70 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
32b80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
32b90 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
32ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32bb0 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
32bc0 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
32bd0 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
32be0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
32c00 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
32c10 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
32c20 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
32c30 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
32c40 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
32c50 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
32c60 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
32c70 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
32c80 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
32c90 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
32ca0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
32cb0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
32cc0 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
32cd0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32ce0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32d00 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
32d10 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
32d20 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
32d30 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
32d40 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
32d50 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
32d60 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
32d70 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
32d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
32d90 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
32da0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
32db0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
32dc0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
32dd0 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
32de0 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
32df0 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
32e00 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
32e10 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
32e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e30 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
32e40 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
32e50 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
32e60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32e70 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
32e80 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
32e90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32ea0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32eb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
32ec0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
32ed0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
32ee0 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
32ef0 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
32f00 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
32f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32f20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
32f30 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
32f40 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
32f50 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
32f60 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
32f70 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
32f80 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
32f90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
32fa0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
32fb0 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
32fc0 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
32fd0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
32fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33000 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33010 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
33020 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33030 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
33040 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33050 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
33060 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
33070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
33080 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33090 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
330a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
330b0 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
330c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
330d0 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
330e0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
330f0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
33100 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
33110 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
33120 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
33130 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
33140 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
33150 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
33160 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
33170 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33180 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
33190 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
331a0 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
331b0 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
331c0 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
331d0 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
331e0 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
331f0 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
33200 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
33210 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
33220 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
33230 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
33240 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
33250 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
33260 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
33270 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
33280 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
33290 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
332a0 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
332b0 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
332c0 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
332d0 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
332e0 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
332f0 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
33300 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33310 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
33320 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
33330 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
33340 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
33350 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
33360 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
33370 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
33380 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
33390 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
333a0 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
333b0 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
333c0 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
333d0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
333e0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
333f0 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
33400 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
33410 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
33420 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
33430 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
33440 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
33450 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
33460 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
33470 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
33480 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
33490 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
334a0 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
334b0 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
334c0 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
334d0 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
334e0 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
334f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
33500 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
33510 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
33520 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33530 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
33540 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
33550 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
33560 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
33570 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
33580 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
33590 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
335a0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
335b0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
335c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
335d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
335e0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
335f0 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33600 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33610 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
33620 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
33630 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33640 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33650 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33660 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
33670 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
33680 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
33690 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
336a0 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
336b0 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
336c0 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
336d0 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
336e0 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
336f0 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
33700 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
33710 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
33720 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
33730 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
33740 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
33750 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
33760 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
33770 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
33780 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33790 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
337a0 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
337b0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
337c0 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
337d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
337e0 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
337f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33800 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
33810 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
33820 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
33830 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
33840 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
33850 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33860 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
33870 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33880 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
33890 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
338a0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
338b0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
338c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
338d0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
338e0 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
338f0 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
33900 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
33910 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
33920 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33930 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
33940 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
33950 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
33960 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
33970 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
33980 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
33990 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
339a0 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
339b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
339c0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
339d0 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
339e0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
339f0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33a00 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
33a10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
33a20 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
33a30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
33a40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33a50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
33a60 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
33a70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
33a80 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
33a90 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
33aa0 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
33ab0 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
33ac0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
33ad0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
33ae0 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
33af0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
33b00 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
33b10 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
33b20 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
33b30 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33b40 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74  LITE_OK || sqlit
33b50 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
33b60 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
33b70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20  DbPage)<=1 );.  
33b80 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
33b90 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67  TE_OK || (*ppPag
33ba0 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  e)->isInit==0 );
33bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
33bc0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
33bd0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
33be0 61 64 64 20 70 61 67 65 20 69 50 61 67 65 20 74  add page iPage t
33bf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
33c00 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a  ile free-list. .
33c10 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  ** It is assumed
33c20 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
33c30 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20  s not already a 
33c40 70 61 72 74 20 6f 66 20 74 68 65 20 66 72 65 65  part of the free
33c50 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  -list..**.** The
33c60 20 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73   value passed as
33c70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
33c80 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
33c90 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61  ction is optiona
33ca0 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c  l..** If the cal
33cb0 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68  ler happens to h
33cc0 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ave a pointer to
33cd0 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
33ce0 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  ect .** correspo
33cf0 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50  nding to page iP
33d00 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61  age handy, it ma
33d10 79 20 70 61 73 73 20 69 74 20 61 73 20 74 68 65  y pass it as the
33d20 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a   second value. .
33d30 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  ** Otherwise, it
33d40 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a   may pass NULL..
33d50 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74  **.** If a point
33d60 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20  er to a MemPage 
33d70 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73 65 64  object is passed
33d80 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
33d90 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20  rgument,.** its 
33da0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
33db0 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62  is not altered b
33dc0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
33dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
33de0 72 65 65 50 61 67 65 32 28 42 74 53 68 61 72 65  reePage2(BtShare
33df0 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20  d *pBt, MemPage 
33e00 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20  *pMemPage, Pgno 
33e10 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  iPage){.  MemPag
33e20 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20  e *pTrunk = 0;  
33e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33e40 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   Free-list trunk
33e50 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
33e60 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  iTrunk = 0;     
33e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33e80 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * Page number of
33e90 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
33ea0 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50   page */ .  MemP
33eb0 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
33ec0 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20  t->pPage1;      
33ed0 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e  /* Local referen
33ee0 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
33ef0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
33f00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33f10 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65        /* Page be
33f20 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62  ing freed. May b
33f30 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74  e NULL. */.  int
33f40 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
33f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f60 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
33f70 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20  */.  int nFree; 
33f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f90 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
33fa0 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  ial number of pa
33fb0 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74  ges on free-list
33fc0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
33fd0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33fe0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
33ff0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
34000 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31  PT_DB || iPage>1
34010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
34020 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50  MemPage || pMemP
34030 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65  age->pgno==iPage
34040 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65   );..  if( iPage
34050 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  <2 ) return SQLI
34060 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
34070 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65 20  .  if( pMemPage 
34080 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70  ){.    pPage = p
34090 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71 6c  MemPage;.    sql
340a0 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
340b0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
340c0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
340d0 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
340e0 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  up(pBt, iPage);.
340f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d    }..  /* Increm
34100 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61 67  ent the free pag
34110 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65  e count on pPage
34120 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  1 */.  rc = sqli
34130 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
34140 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
34150 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
34160 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
34170 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
34180 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34190 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  36]);.  put4byte
341a0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
341b0 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a  36], nFree+1);..
341c0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
341d0 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45  ags & BTS_SECURE
341e0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f  _DELETE ){.    /
341f0 2a 20 49 66 20 74 68 65 20 73 65 63 75 72 65 5f  * If the secure_
34200 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20 69 73  delete option is
34210 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20   enabled, then. 
34220 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c     ** always ful
34230 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c  ly overwrite del
34240 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  eted information
34250 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
34260 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 50   */.    if( (!pP
34270 61 67 65 20 26 26 20 28 28 72 63 20 3d 20 62 74  age && ((rc = bt
34280 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
34290 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
342a0 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c  ))!=0) ).     ||
342b0 20 20 20 20 20 20 20 20 20 20 20 20 28 28 72 63              ((rc
342c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
342d0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
342e0 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20 29 7b  age))!=0).    ){
342f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34300 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34310 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65      memset(pPage
34320 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
34330 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
34340 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
34350 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
34360 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
34370 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72  m, write an entr
34380 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72  y in the pointer
34390 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64  -map.  ** to ind
343a0 69 63 61 74 65 20 74 68 61 74 20 74 68 65 20 70  icate that the p
343b0 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a  age is free..  *
343c0 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56 41  /.  if( ISAUTOVA
343d0 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d  CUUM ){.    ptrm
343e0 61 70 50 75 74 28 70 42 74 2c 20 69 50 61 67 65  apPut(pBt, iPage
343f0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
34400 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20 20 20  E, 0, &rc);.    
34410 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72  if( rc ) goto fr
34420 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
34430 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75  .  /* Now manipu
34440 6c 61 74 65 20 74 68 65 20 61 63 74 75 61 6c 20  late the actual 
34450 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69  database free-li
34460 73 74 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  st structure. Th
34470 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a  ere are two.  **
34480 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 2e 20   possibilities. 
34490 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
344a0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 65 6d   is currently em
344b0 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65 20 66  pty, or if the f
344c0 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20  irst.  ** trunk 
344d0 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
344e0 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c 20 74  -list is full, t
344f0 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 77 69  hen this page wi
34500 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a  ll become a.  **
34510 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 74   new free-list t
34520 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68 65 72  runk page. Other
34530 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20 62 65  wise, it will be
34540 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66 20 74  come a leaf of t
34550 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72  he.  ** first tr
34560 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
34570 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c 69 73  current free-lis
34580 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65  t. This block te
34590 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a 20 69  sts if it.  ** i
345a0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  s possible to ad
345b0 64 20 74 68 65 20 70 61 67 65 20 61 73 20 61 20  d the page as a 
345c0 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  new free-list le
345d0 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e  af..  */.  if( n
345e0 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20 20 75  Free!=0 ){.    u
345f0 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20 20 20  32 nLeaf;       
34600 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74           /* Init
34610 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65  ial number of le
34620 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e  af cells on trun
34630 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69  k page */..    i
34640 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65  Trunk = get4byte
34650 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
34660 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  32]);.    rc = b
34670 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
34680 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
34690 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
346a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
346b0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
346c0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
346d0 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74 34 62     nLeaf = get4b
346e0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
346f0 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73 73 65  ta[4]);.    asse
34700 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
34710 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20 69 66  ize>32 );.    if
34720 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32 29 70  ( nLeaf > (u32)p
34730 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
34740 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 72 63   - 2 ){.      rc
34750 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
34760 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
34770 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
34780 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
34790 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42 74 2d  Leaf < (u32)pBt-
347a0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
347b0 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  8 ){.      /* In
347c0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 72 65   this case there
347d0 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20   is room on the 
347e0 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e  trunk page to in
347f0 73 65 72 74 20 74 68 65 20 70 61 67 65 0a 20 20  sert the page.  
34800 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66 72 65      ** being fre
34810 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65 61 66  ed as a new leaf
34820 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
34830 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
34840 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  e trunk page is 
34850 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20  not really full 
34860 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e  until it contain
34870 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  s.      ** usabl
34880 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72  eSize/4 - 2 entr
34890 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53  ies, not usableS
348a0 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65  ize/4 - 8 entrie
348b0 73 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20  s as we have.   
348c0 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75     ** coded.  Bu
348d0 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e  t due to a codin
348e0 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69  g error in versi
348f0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72  ons of SQLite pr
34900 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  ior to.      ** 
34910 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73  3.6.0, databases
34920 20 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74   with freelist t
34930 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69  runk pages holdi
34940 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20  ng more than.   
34950 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
34960 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77  /4 - 8 entries w
34970 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20  ill be reported 
34980 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20  as corrupt.  In 
34990 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74  order.      ** t
349a0 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77  o maintain backw
349b0 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
349c0 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65  ty with older ve
349d0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
349e0 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69  ,.      ** we wi
349f0 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72  ll continue to r
34a00 65 73 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62  estrict the numb
34a10 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f  er of entries to
34a20 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34a30 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e  8.      ** for n
34a40 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69  ow.  At some poi
34a50 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65  nt in the future
34a60 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20   (once everyone 
34a70 68 61 73 20 75 70 67 72 61 64 65 64 0a 20 20 20  has upgraded.   
34a80 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f     ** to 3.6.0 o
34a90 72 20 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75  r later) we shou
34aa0 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69  ld consider fixi
34ab0 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e  ng the condition
34ac0 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a  al above.      *
34ad0 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c  * to read "usabl
34ae0 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65  eSize/4-2" inste
34af0 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a  ad of "usableSiz
34b00 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a  e/4-8"..      **
34b10 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
34b20 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31  CE-OF: R-19920-1
34b30 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20 6e 65  1576 However, ne
34b40 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
34b50 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20 20 20  SQLite still.   
34b60 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e     ** avoid usin
34b70 67 20 74 68 65 20 6c 61 73 74 20 73 69 78 20 65  g the last six e
34b80 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 66 72  ntries in the fr
34b90 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
34ba0 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20 20 20  e array in.     
34bb0 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74 20 64   ** order that d
34bc0 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 63 72  atabase files cr
34bd0 65 61 74 65 64 20 62 79 20 6e 65 77 65 72 20 76  eated by newer v
34be0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
34bf0 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20 20 2a  e can be.      *
34c00 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65 72 20  * read by older 
34c10 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
34c20 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
34c30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
34c40 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
34c50 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
34c60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
34c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
34c80 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
34c90 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66  >aData[4], nLeaf
34ca0 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  +1);.        put
34cb0 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
34cc0 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c  Data[8+nLeaf*4],
34cd0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20   iPage);.       
34ce0 20 69 66 28 20 70 50 61 67 65 20 26 26 20 28 70   if( pPage && (p
34cf0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
34d00 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
34d10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
34d20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f    sqlite3PagerDo
34d30 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  ntWrite(pPage->p
34d40 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
34d50 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
34d60 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
34d70 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29 3b 0a  nt(pBt, iPage);.
34d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
34d90 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
34da0 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e   %d leaf on trun
34db0 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61  k page %d\n",pPa
34dc0 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d  ge->pgno,pTrunk-
34dd0 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  >pgno));.      g
34de0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
34df0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
34e00 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f  * If control flo
34e10 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ws to this point
34e20 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20 6e 6f  , then it was no
34e30 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 64  t possible to ad
34e40 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 70  d the.  ** the p
34e50 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
34e60 61 73 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f  as a leaf page o
34e70 66 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  f the first trun
34e80 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
34e90 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c  st..  ** Possibl
34ea0 79 20 62 65 63 61 75 73 65 20 74 68 65 20 66 72  y because the fr
34eb0 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70 74 79  ee-list is empty
34ec0 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20 62 65  , or possibly be
34ed0 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  cause the .  ** 
34ee0 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20 74  first trunk in t
34ef0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
34f00 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77 61 79  full. Either way
34f10 2c 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67  , the page being
34f20 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c   freed.  ** will
34f30 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20   become the new 
34f40 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65  first trunk page
34f50 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
34f60 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  t..  */.  if( pP
34f70 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  age==0 && SQLITE
34f80 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72 65 65  _OK!=(rc = btree
34f90 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
34fa0 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 20  ge, &pPage, 0)) 
34fb0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
34fc0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
34fd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34fe0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34ff0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
35000 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35010 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
35020 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34  _out;.  }.  put4
35030 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
35040 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75  a, iTrunk);.  pu
35050 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
35060 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70  Data[4], 0);.  p
35070 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
35080 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50 61 67  >aData[32], iPag
35090 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22 46 52  e);.  TRACE(("FR
350a0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
350b0 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
350c0 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50 61 67  cing %d\n", pPag
350d0 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29  e->pgno, iTrunk)
350e0 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f 75 74  );..freepage_out
350f0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 7b  :.  if( pPage ){
35100 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
35110 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
35120 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
35130 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
35140 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72  pTrunk);.  retur
35150 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76  n rc;.}.static v
35160 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d 65 6d  oid freePage(Mem
35170 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
35180 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20 28 2a   *pRC){.  if( (*
35190 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  pRC)==SQLITE_OK 
351a0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 66 72  ){.    *pRC = fr
351b0 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
351c0 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
351d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  ->pgno);.  }.}..
351e0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
351f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
35200 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
35210 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20 20 53  e given Cell.  S
35220 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69 6e 66  tore.** size inf
35230 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
35240 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e 66 6f  he cell in pInfo
35250 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35260 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d  clearCell(.  Mem
35270 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
35280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
35290 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
352a0 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the Cell */.  un
352b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
352c0 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ll,    /* First 
352d0 62 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c  byte of the Cell
352e0 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
352f0 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f  pInfo          /
35300 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69  * Size informati
35310 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c  on about the cel
35320 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72  l */.){.  BtShar
35330 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e 6f 20  ed *pBt;.  Pgno 
35340 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  ovflPgno;.  int 
35350 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b  rc;.  int nOvfl;
35360 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67 65 53  .  u32 ovflPageS
35370 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
35380 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
35390 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
353a0 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65  utex) );.  pPage
353b0 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
353c0 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
353d0 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e  );.  if( pInfo->
353e0 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e  nLocal==pInfo->n
353f0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
35400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
35410 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
35420 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
35430 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
35440 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 74  thing */.  }.  t
35450 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 20 2b  estcase( pCell +
35460 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 3d   pInfo->nSize ==
35470 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64   pPage->aDataEnd
35480 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
35490 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e  pCell + (pInfo->
354a0 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50 61 67  nSize-1) == pPag
354b0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
354c0 20 69 66 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e   if( pCell + pIn
354d0 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50 61 67  fo->nSize > pPag
354e0 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20  e->aDataEnd ){. 
354f0 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e     /* Cell exten
35500 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  ds past end of p
35510 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  age */.    retur
35520 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
35530 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
35540 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67  }.  ovflPgno = g
35550 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20  et4byte(pCell + 
35560 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34  pInfo->nSize - 4
35570 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
35580 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
35590 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
355a0 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
355b0 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
355c0 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
355d0 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f 2d 3e  nOvfl = (pInfo->
355e0 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e 66 6f  nPayload - pInfo
355f0 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  ->nLocal + ovflP
35600 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
35610 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
35620 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
35630 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
35640 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79   && (pInfo->nPay
35650 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53  load + ovflPageS
35660 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a  ize)<ovflPageSiz
35670 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28  e).  );.  while(
35680 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20   nOvfl-- ){.    
35690 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a  Pgno iNext = 0;.
356a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
356b0 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  fl = 0;.    if( 
356c0 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76  ovflPgno<2 || ov
356d0 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65  flPgno>btreePage
356e0 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
356f0 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20      /* 0 is not 
35700 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  a legal page num
35710 62 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63  ber and page 1 c
35720 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20  annot be an .   
35730 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
35740 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69  age. Therefore i
35750 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20  f ovflPgno<2 or 
35760 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
35770 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69  the .      ** fi
35780 6c 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  le the database 
35790 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
357a0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
357b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
357c0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
357d0 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20  if( nOvfl ){.   
357e0 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
357f0 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66  lowPage(pBt, ovf
35800 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26  lPgno, &pOvfl, &
35810 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  iNext);.      if
35820 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
35830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
35840 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f   ( pOvfl || ((pO
35850 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c  vfl = btreePageL
35860 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50  ookup(pBt, ovflP
35870 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20  gno))!=0) ).    
35880 20 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72   && sqlite3Pager
35890 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76  PageRefcount(pOv
358a0 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a  fl->pDbPage)!=1.
358b0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
358c0 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73  There is no reas
358d0 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68  on any cursor sh
358e0 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74  ould have an out
358f0 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
35900 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ce .      ** to 
35910 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
35920 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20   belonging to a 
35930 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69  cell that is bei
35940 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74  ng deleted/updat
35950 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20  ed..      ** So 
35960 69 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20  if there exists 
35970 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65  more than one re
35980 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20  ference to this 
35990 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20  page, then it . 
359a0 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74       ** must not
359b0 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76   really be an ov
359c0 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20  erflow page and 
359d0 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  the database mus
359e0 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20  t be corrupt. . 
359f0 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65       ** It is he
35a00 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20  lpful to detect 
35a10 74 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c  this before call
35a20 69 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c  ing freePage2(),
35a30 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72   as .      ** fr
35a40 65 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65  eePage2() may ze
35a50 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  ro the page cont
35a60 65 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64  ents if secure-d
35a70 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20  elete mode is.  
35a80 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20      ** enabled. 
35a90 49 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f  If this 'overflo
35aa0 77 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20  w' page happens 
35ab0 74 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61  to be a page tha
35ac0 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  t the.      ** c
35ad0 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69  aller is iterati
35ae0 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73  ng through or us
35af0 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65  ing in some othe
35b00 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20  r way, this.    
35b10 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62    ** can be prob
35b20 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a  lematic..      *
35b30 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
35b40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
35b50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35b60 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
35b70 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76  2(pBt, pOvfl, ov
35b80 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a  flPgno);.    }..
35b90 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
35ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
35bb0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
35bc0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
35bd0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
35be0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
35bf0 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
35c00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
35c10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
35c20 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
35c30 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
35c40 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
35c50 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
35c60 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
35c70 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
35c80 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
35c90 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
35ca0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
35cb0 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
35cc0 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
35cd0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
35ce0 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
35cf0 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
35d00 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
35d10 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
35d20 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
35d30 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
35d40 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
35d50 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
35d60 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
35d70 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
35d80 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
35d90 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
35da0 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
35db0 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
35dc0 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
35dd0 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
35de0 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
35df0 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
35e00 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
35e10 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
35e20 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
35e30 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
35e40 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
35e50 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
35e60 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
35e70 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
35e80 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
35e90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
35ea0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
35eb0 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
35ec0 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61 64 20  st BtreePayload 
35ed0 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  *pX,        /* P
35ee0 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68 69 63  ayload with whic
35ef0 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 74  h to construct t
35f00 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  he cell */.  int
35f10 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
35f20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
35f30 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65 20 68  rite cell size h
35f40 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
35f50 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73  nPayload;.  cons
35f60 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e  t u8 *pSrc;.  in
35f70 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c 20 6d  t nSrc, n, rc, m
35f80 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  n;.  int spaceLe
35f90 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
35fa0 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75 6e 73  ToRelease;.  uns
35fb0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
35fc0 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
35fd0 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
35fe0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 0a   BtShared *pBt;.
35ff0 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 3b    Pgno pgnoOvfl;
36000 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
36010 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36020 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
36030 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
36040 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
36050 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
36060 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
36070 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
36080 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
36090 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
360a0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
360b0 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
360c0 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
360d0 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
360e0 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
360f0 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
36100 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  a[pPage->pBt->pa
36110 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20  geSize].        
36120 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61      || sqlite3Pa
36130 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
36140 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
36150 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
36160 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20  the header. */. 
36170 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67 65   nHeader = pPage
36180 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
36190 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
361a0 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61 79 6c  Key ){.    nPayl
361b0 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74 61 20  oad = pX->nData 
361c0 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20 20 20  + pX->nZero;.   
361d0 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44 61 74   pSrc = pX->pDat
361e0 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 70 58  a;.    nSrc = pX
361f0 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->nData;.    ass
36200 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
36210 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66 69 6c  eyLeaf ); /* fil
36220 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 63  lInCell() only c
36230 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76 65 73  alled for leaves
36240 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65 72 20   */.    nHeader 
36250 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
36260 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36270 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 6e  nPayload);.    n
36280 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
36290 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
362a0 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70 58 2d  er], *(u64*)&pX-
362b0 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b  >nKey);.  }else{
362c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
362d0 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66  >nKey<=0x7ffffff
362e0 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21 3d 30  f && pX->pKey!=0
362f0 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e   );.    nSrc = n
36300 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 70  Payload = (int)p
36310 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72  X->nKey;.    pSr
36320 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a 20 20  c = pX->pKey;.  
36330 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
36340 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
36350 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f  nHeader], nPaylo
36360 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ad);.  }.  .  /*
36370 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
36380 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79 6c 6f  load */.  pPaylo
36390 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
363a0 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50 61 79  der];.  if( nPay
363b0 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
363c0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20  Local ){.    /* 
363d0 54 68 69 73 20 69 73 20 74 68 65 20 63 6f 6d 6d  This is the comm
363e0 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 65 76  on case where ev
363f0 65 72 79 74 68 69 6e 67 20 66 69 74 73 20 6f 6e  erything fits on
36400 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65 0a   the btree page.
36410 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20 6f 76      ** and no ov
36420 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
36430 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
36440 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20 2b 20    n = nHeader + 
36450 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 74 65  nPayload;.    te
36460 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29 3b 0a  stcase( n==3 );.
36470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
36480 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c  =4 );.    if( n<
36490 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20 20 2a  4 ) n = 4;.    *
364a0 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  pnSize = n;.    
364b0 61 73 73 65 72 74 28 20 6e 53 72 63 3c 3d 6e 50  assert( nSrc<=nP
364c0 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 74 65  ayload );.    te
364d0 73 74 63 61 73 65 28 20 6e 53 72 63 3c 6e 50 61  stcase( nSrc<nPa
364e0 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d 65 6d  yload );.    mem
364f0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
36500 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20 20 6d  rc, nSrc);.    m
36510 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2b 6e  emset(pPayload+n
36520 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f 61 64  Src, 0, nPayload
36530 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72 65 74 75  -nSrc);.    retu
36540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
36550 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65  }..  /* If we re
36560 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20  ach this point, 
36570 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 73 6f  it means that so
36580 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e  me of the conten
36590 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20 2a 2a  t will need.  **
365a0 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 20 6f   to spill onto o
365b0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
365c0 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61 67 65   */.  mn = pPage
365d0 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6e 20  ->minLocal;.  n 
365e0 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64  = mn + (nPayload
365f0 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d   - mn) % (pPage-
36600 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
36610 20 2d 20 34 29 3b 0a 20 20 74 65 73 74 63 61 73   - 4);.  testcas
36620 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
36630 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
36640 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
36650 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69  axLocal+1 );.  i
36660 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d 61  f( n > pPage->ma
36670 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e 3b  xLocal ) n = mn;
36680 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 6e  .  spaceLeft = n
36690 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20  ;.  *pnSize = n 
366a0 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b 0a 20  + nHeader + 4;. 
366b0 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c   pPrior = &pCell
366c0 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 70  [nHeader+n];.  p
366d0 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20  ToRelease = 0;. 
366e0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20   pgnoOvfl = 0;. 
366f0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
36700 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  t;..  /* At this
36710 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c 65 73   point variables
36720 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 61   should be set a
36730 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a 2a 0a  s follows:.  **.
36740 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61 64 20    **   nPayload 
36750 20 20 20 20 20 20 20 20 20 20 54 6f 74 61 6c 20            Total 
36760 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69 6e 20  payload size in 
36770 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70 50 61  bytes.  **   pPa
36780 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
36790 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20 70 61  Begin writing pa
367a0 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a 2a 20  yload here.  ** 
367b0 20 20 73 70 61 63 65 4c 65 66 74 20 20 20 20 20    spaceLeft     
367c0 20 20 20 20 20 53 70 61 63 65 20 61 76 61 69 6c       Space avail
367d0 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f 61 64  able at pPayload
367e0 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64 3e 73  .  If nPayload>s
367f0 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a 20 20  paceLeft,.  **  
36800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36810 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73 20 63      that means c
36820 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70 69 6c  ontent must spil
36830 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  l into overflow 
36840 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20 2a 70  pages..  **   *p
36850 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
36860 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c 6f 63   Size of the loc
36870 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63 6f 75  al cell (not cou
36880 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77 20 70  nting overflow p
36890 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70 50 72  ages).  **   pPr
368a0 69 6f 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ior             
368b0 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 74  Where to write t
368c0 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 66  he pgno of the f
368d0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
368e0 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55 73 65  ge.  **.  ** Use
368f0 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65   a call to btree
36900 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 74  ParseCellPtr() t
36910 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
36920 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65 0a 20  e values above. 
36930 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75 74 65   ** were compute
36940 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  d correctly..  *
36950 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
36960 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
36970 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
36980 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
36990 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
369a0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
369b0 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
369c0 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
369d0 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
369e0 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
369f0 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20 29 3b  Key==pX->nKey );
36a00 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e  .    assert( *pn
36a10 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69  Size == info.nSi
36a20 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
36a30 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69  ( spaceLeft == i
36a40 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20  nfo.nLocal );.  
36a50 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57  }.#endif..  /* W
36a60 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64  rite the payload
36a70 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20   into the local 
36a80 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74  Cell and any ext
36a90 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77  ra into overflow
36aa0 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c   pages */.  whil
36ab0 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 20 3d 20  e( 1 ){.    n = 
36ac0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
36ad0 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
36ae0 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
36af0 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
36b00 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
36b10 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
36b20 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
36b30 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
36b40 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
36b50 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
36b60 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
36b70 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
36b80 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
36b90 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
36ba0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
36bb0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
36bc0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
36bd0 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
36be0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
36bf0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
36c00 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
36c10 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
36c20 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
36c30 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
36c40 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
36c50 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
36c60 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
36c70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
36c80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
36c90 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
36ca0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
36cb0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
36cc0 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20 20 20   nSrc>=n ){.    
36cd0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
36ce0 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20  d, pSrc, n);.   
36cf0 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 72 63 3e   }else if( nSrc>
36d00 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6e  0 ){.      n = n
36d10 53 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  Src;.      memcp
36d20 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
36d30 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
36d40 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
36d50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
36d60 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
36d70 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  d -= n;.    if( 
36d80 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20 62 72  nPayload<=0 ) br
36d90 65 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  eak;.    pPayloa
36da0 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
36db0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
36dc0 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
36dd0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
36de0 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30 20 29  ( spaceLeft==0 )
36df0 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  {.      MemPage 
36e00 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69 66 6e  *pOvfl = 0;.#ifn
36e10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36e20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
36e30 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
36e40 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
36e50 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
36e60 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
36e70 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
36e80 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
36e90 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
36ea0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
36eb0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
36ec0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
36ed0 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
36ee0 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
36ef0 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
36f00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
36f10 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
36f20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
36f30 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
36f40 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
36f50 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
36f60 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
36f70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36f80 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36f90 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
36fa0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
36fb0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
36fc0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
36fd0 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
36fe0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
36ff0 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
37000 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
37010 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
37020 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
37030 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
37040 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
37050 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
37060 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
37070 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
37080 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
37090 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
370a0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
370b0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
370c0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
370d0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
370e0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
370f0 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
37100 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
37110 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
37120 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
37130 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
37140 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
37150 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
37160 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
37170 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
37180 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
37190 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
371a0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
371b0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
371c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
371d0 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
371e0 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
371f0 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
37200 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
37210 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
37220 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
37230 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
37240 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
37250 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
37260 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
37270 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
37280 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
37290 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
372a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
372b0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
372c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
372d0 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
372e0 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
372f0 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
37300 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
37310 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
37320 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
37330 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
37340 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
37350 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
37360 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
37370 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
37380 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
37390 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
373a0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
373b0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
373c0 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
373d0 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
373e0 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
373f0 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
37400 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
37410 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37420 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
37430 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
37440 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
37450 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
37460 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
37470 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
37480 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
37490 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
374a0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
374b0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
374c0 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
374d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
374e0 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
374f0 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
37500 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
37510 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
37520 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
37530 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
37540 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
37550 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
37560 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
37570 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
37580 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   - 4;.    }.  }.
37590 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
375a0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
375b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
375c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
375d0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
375e0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
375f0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
37600 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
37610 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
37620 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
37630 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
37640 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
37650 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
37660 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
37670 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
37680 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
37690 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
376a0 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
376b0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
376c0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
376d0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
376e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
376f0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
37700 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43  tatic void dropC
37710 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
37720 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  ge, int idx, int
37730 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a   sz, int *pRC){.
37740 20 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20    u32 pc;       
37750 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63    /* Offset to c
37760 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63  ell content of c
37770 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65  ell being delete
37780 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  d */.  u8 *data;
37790 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d         /* pPage-
377a0 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a  >aData */.  u8 *
377b0 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55  ptr;        /* U
377c0 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65  sed to move byte
377d0 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20  s around within 
377e0 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  data[] */.  int 
377f0 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  rc;         /* T
37800 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  he return code *
37810 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
37820 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67      /* Beginning
37830 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20   of the header. 
37840 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20   0 most pages.  
37850 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20  100 page 1 */.. 
37860 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
37870 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rn;.  assert( id
37880 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
37890 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
378a0 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
378b0 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
378c0 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
378d0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
378e0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
378f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
37900 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
37910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
37920 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
37930 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
37940 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
37950 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
37960 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
37970 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
37980 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
37990 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
379a0 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
379b0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
379c0 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
379d0 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
379e0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
379f0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 2b  ize );.  if( pc+
37a00 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
37a10 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
37a20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
37a30 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
37a40 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
37a50 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
37a60 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
37a70 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
37a80 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
37a90 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
37aa0 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
37ab0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
37ac0 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
37ad0 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
37ae0 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
37af0 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
37b00 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
37b10 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
37b20 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
37b30 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
37b40 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
37b50 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
37b60 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
37b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b80 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
37b90 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
37ba0 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
37bb0 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
37bc0 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
37bd0 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
37be0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
37bf0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
37c00 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
37c10 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
37c20 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
37c30 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
37c40 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
37c50 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
37c60 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
37c70 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
37c80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
37c90 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
37ca0 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
37cb0 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
37cc0 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
37cd0 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
37ce0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
37cf0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
37d00 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
37d10 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
37d20 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
37d30 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
37d40 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
37d50 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
37d60 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
37d70 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
37d80 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
37d90 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
37da0 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
37db0 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
37dc0 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
37dd0 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
37de0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
37df0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
37e00 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
37e10 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
37e20 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
37e30 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73 74  .**.** *pRC must
37e40 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77 68   be SQLITE_OK wh
37e50 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
37e60 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
37e70 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72 74  atic void insert
37e80 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
37e90 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67  *pPage,   /* Pag
37ea0 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20  e into which we 
37eb0 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20  are copying */. 
37ec0 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20   int i,         
37ed0 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62     /* New cell b
37ee0 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20  ecomes the i-th 
37ef0 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65  cell of the page
37f00 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
37f10 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
37f20 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65  nt of the new ce
37f30 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20  ll */.  int sz, 
37f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
37f50 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e  es of content in
37f60 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
37f70 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a  pTemp,        /*
37f80 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70   Temp storage sp
37f90 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69  ace for pCell, i
37fa0 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50 67  f needed */.  Pg
37fb0 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20 20  no iChild,      
37fc0 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  /* If non-zero, 
37fd0 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34 20  replace first 4 
37fe0 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73 20  bytes with this 
37ff0 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
38000 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pRC          /* 
38010 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 72  Read and write r
38020 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
38030 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
38040 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20 2f   idx = 0;      /
38050 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
38060 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   new cell conten
38070 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  t in data[] */. 
38080 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
38090 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
380a0 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  er */.  u8 *data
380b0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
380c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
380d0 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20 20  whole page */.  
380e0 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20 20  u8 *pIns;       
380f0 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
38100 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  n pPage->aCellId
38110 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65 6c  x[] where no cel
38120 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a 20  l inserted */.. 
38130 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d 53   assert( *pRC==S
38140 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
38150 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c  sert( i>=0 && i<
38160 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50  =pPage->nCell+pP
38170 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  age->nOverflow )
38180 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43  ;.  assert( MX_C
38190 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c  ELL(pPage->pBt)<
381a0 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65  =10921 );.  asse
381b0 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
381c0 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d  <=MX_CELL(pPage-
381d0 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54  >pBt) || CORRUPT
381e0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
381f0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
38200 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  w<=ArraySize(pPa
38210 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20  ge->apOvfl) );. 
38220 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
38230 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  ze(pPage->apOvfl
38240 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61  )==ArraySize(pPa
38250 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20  ge->aiOvfl) );. 
38260 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
38270 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
38280 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
38290 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20  ;.  /* The cell 
382a0 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
382b0 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74  be sized correct
382c0 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68  ly.  However, wh
382d0 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a  en moving a.  **
382e0 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20   malformed cell 
382f0 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65  from a leaf page
38300 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20   to an interior 
38310 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c  page, if the cel
38320 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74  l size.  ** want
38330 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68  ed to be less th
38340 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75  an 4 but got rou
38350 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20  nded up to 4 on 
38360 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73  the leaf, then s
38370 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ize.  ** might b
38380 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c  e less than 8 (l
38390 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74  eaf-size + point
383a0 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72  er) on the inter
383b0 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65  ior node.  Hence
383c0 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61  .  ** the term a
383d0 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74  fter the || in t
383e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
383f0 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65  ert(). */.  asse
38400 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78  rt( sz==pPage->x
38410 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
38420 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38  pCell) || (sz==8
38430 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b   && iChild>0) );
38440 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f  .  if( pPage->nO
38450 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e  verflow || sz+2>
38460 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
38470 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b      if( pTemp ){
38480 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54  .      memcpy