/ Hex Artifact Content
Login

Artifact fcfd6b960e56d017364e1d602145d462292ef4820662901209dc286ec0d1b7a8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 6d 65 6d 73 65 74 28 28 28 75 38       memset(((u8
5c60: 2a 29 70 4b 65 79 29 2b 70 43 75 72 2d 3e 6e 4b  *)pKey)+pCur->nK
5c70: 65 79 2c 20 30 2c 20 39 2b 38 29 3b 0a 20 20 20  ey, 0, 9+8);.   
5c80: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c90: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5ca0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5cb0: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5cd0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5ce0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5d00: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5d10: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5d20: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d30: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d40: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d50: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d60: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d70: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d80: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d90: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5da0: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5db0: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5dc0: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5dd0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5de0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5df0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5e00: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5e10: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5e20: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e30: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e40: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e50: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e60: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e70: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e80: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e90: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5ea0: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5eb0: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5ec0: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ed0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5ee0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ef0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5f00: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5f10: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5f20: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f30: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f40: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f50: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f60: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f70: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f80: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5fa0: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5fb0: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5fc0: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fd0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fe0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5ff0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
6000: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
6010: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
6020: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6030: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6040: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6050: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6060: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6070: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6080: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6090: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
60a0: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
60b0: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
60c0: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60d0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60e0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60f0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
6100: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
6110: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
6120: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6130: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6140: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6150: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6160: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6170: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6180: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6190: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
61a0: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
61b0: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
61c0: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61d0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61e0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61f0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
6200: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
6210: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
6220: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6230: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6240: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6250: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6260: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6270: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6280: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6290: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
62a0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
62b0: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
62c0: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62d0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62e0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62f0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
6300: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
6310: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
6320: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6330: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6340: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6350: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6360: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6370: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6380: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6390: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
63a0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
63b0: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
63c0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63d0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63e0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63f0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
6400: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
6410: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
6420: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6430: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6440: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6450: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6460: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6470: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6480: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6490: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
64a0: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
64b0: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
64c0: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64d0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64e0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64f0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
6500: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
6510: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
6520: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6530: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6540: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6550: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6560: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6580: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6590: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
65a0: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
65b0: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
65c0: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65d0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65e0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65f0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
6600: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
6610: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
6620: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6630: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6640: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6650: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6660: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6670: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6680: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6690: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
66a0: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
66b0: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
66c0: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66d0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66e0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66f0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
6700: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
6710: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
6720: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6730: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6740: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6750: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6760: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6770: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6780: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6790: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
67a0: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
67b0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
67c0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67d0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67e0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67f0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
6800: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
6810: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
6820: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6830: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6840: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6850: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6860: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6870: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6880: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6890: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
68a0: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
68b0: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
68c0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68d0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68e0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
6900: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6910: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
6920: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6930: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6940: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6950: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6960: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6970: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6980: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
69a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
69b0: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
69c0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69d0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69e0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
6a00: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
6a10: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
6a20: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a30: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a40: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a50: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a60: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a70: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a80: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a90: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6aa0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6ab0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6ac0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6ad0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6af0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6b00: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6b10: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6b20: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b30: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b40: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b50: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b60: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b70: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b80: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b90: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6ba0: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6bb0: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6bc0: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6bd0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6be0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bf0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6c00: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6c10: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6c20: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c30: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c40: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c50: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c80: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c90: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6ca0: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6cb0: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6cc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6cd0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6ce0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cf0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6d00: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6d10: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6d20: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d50: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d60: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d70: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d80: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d90: 4b 65 79 20 29 7b 0a 20 20 20 20 4b 65 79 49 6e  Key ){.    KeyIn
6da0: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
6db0: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20  Cur->pKeyInfo;. 
6dc0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3d     assert( nKey=
6dd0: 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79 20  =(i64)(int)nKey 
6de0: 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d  );.    pIdxKey =
6df0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f   sqlite3VdbeAllo
6e00: 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
6e10: 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69  pKeyInfo);.    i
6e20: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6e30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6e40: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6e50: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6e60: 6e 70 61 63 6b 28 70 4b 65 79 49 6e 66 6f 2c 20  npack(pKeyInfo, 
6e70: 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b 65 79 2c  (int)nKey, pKey,
6e80: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 69   pIdxKey);.    i
6e90: 66 28 20 70 49 64 78 4b 65 79 2d 3e 6e 46 69 65  f( pIdxKey->nFie
6ea0: 6c 64 3d 3d 30 20 7c 7c 20 70 49 64 78 4b 65 79  ld==0 || pIdxKey
6eb0: 2d 3e 6e 46 69 65 6c 64 3e 70 4b 65 79 49 6e 66  ->nField>pKeyInf
6ec0: 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 7b 0a  o->nAllField ){.
6ed0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
6ee0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
6ef0: 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
6f00: 6f 5f 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20  o_done;.    }.  
6f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b  }else{.    pIdxK
6f20: 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63  ey = 0;.  }.  rc
6f30: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
6f40: 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43  ovetoUnpacked(pC
6f50: 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65  ur, pIdxKey, nKe
6f60: 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a  y, bias, pRes);.
6f70: 6d 6f 76 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69  moveto_done:.  i
6f80: 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20 20  f( pIdxKey ){.  
6f90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
6fa0: 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  pCur->pKeyInfo->
6fb0: 64 62 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  db, pIdxKey);.  
6fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6fd0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20  ../*.** Restore 
6fe0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
6ff0: 65 20 70 6f 73 69 74 69 6f 6e 20 69 74 20 77 61  e position it wa
7000: 73 20 69 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73  s in (or as clos
7010: 65 20 74 6f 20 61 73 20 70 6f 73 73 69 62 6c 65  e to as possible
7020: 29 0a 2a 2a 20 77 68 65 6e 20 73 61 76 65 43 75  ).** when saveCu
7030: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 77  rsorPosition() w
7040: 61 73 20 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20  as called. Note 
7050: 74 68 61 74 20 74 68 69 73 20 63 61 6c 6c 20 64  that this call d
7060: 65 6c 65 74 65 73 20 74 68 65 20 0a 2a 2a 20 73  eletes the .** s
7070: 61 76 65 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e  aved position in
7080: 66 6f 20 73 74 6f 72 65 64 20 62 79 20 73 61 76  fo stored by sav
7090: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
70a0: 29 2c 20 73 6f 20 74 68 65 72 65 20 63 61 6e 20  ), so there can 
70b0: 62 65 0a 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e  be.** at most on
70c0: 65 20 65 66 66 65 63 74 69 76 65 20 72 65 73 74  e effective rest
70d0: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
70e0: 6e 28 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65  n() call after e
70f0: 61 63 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73  ach .** saveCurs
7100: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f  orPosition()..*/
7110: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
7120: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7130: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
7140: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
7150: 3b 0a 20 20 69 6e 74 20 73 6b 69 70 4e 65 78 74  ;.  int skipNext
7160: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7170: 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
7180: 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
7190: 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
71a0: 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
71b0: 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
71c0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
71d0: 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
71e0: 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
71f0: 6b 69 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 70  kipNext;.  }.  p
7200: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
7210: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
7220: 69 66 28 20 73 71 6c 69 74 65 33 46 61 75 6c 74  if( sqlite3Fault
7230: 53 69 6d 28 34 31 30 29 20 29 7b 0a 20 20 20 20  Sim(410) ){.    
7240: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
7250: 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
7260: 72 63 20 3d 20 62 74 72 65 65 4d 6f 76 65 74 6f  rc = btreeMoveto
7270: 28 70 43 75 72 2c 20 70 43 75 72 2d 3e 70 4b 65  (pCur, pCur->pKe
7280: 79 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30  y, pCur->nKey, 0
7290: 2c 20 26 73 6b 69 70 4e 65 78 74 29 3b 0a 20 20  , &skipNext);.  
72a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
72b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
72c0: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
72d0: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
72e0: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
72f0: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
7300: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
7310: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
7320: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
7330: 44 20 29 3b 0a 20 20 20 20 69 66 28 20 73 6b 69  D );.    if( ski
7340: 70 4e 65 78 74 20 29 20 70 43 75 72 2d 3e 73 6b  pNext ) pCur->sk
7350: 69 70 4e 65 78 74 20 3d 20 73 6b 69 70 4e 65 78  ipNext = skipNex
7360: 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  t;.    if( pCur-
7370: 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70 43 75  >skipNext && pCu
7380: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
7390: 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  R_VALID ){.     
73a0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
73b0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
73d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65 66 69  urn rc;.}..#defi
73e0: 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72  ne restoreCursor
73f0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
7400: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
7410: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
7420: 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74 72 65   \.         btre
7430: 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f  eRestoreCursorPo
7440: 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20  sition(p) : \.  
7450: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7460: 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  )../*.** Determi
7470: 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ne whether or no
7480: 74 20 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d  t a cursor has m
7490: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f  oved from the po
74a0: 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20  sition where.** 
74b0: 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c 61 63  it was last plac
74c0: 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65 6e 20  ed, or has been 
74d0: 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f 72 20  invalidated for 
74e0: 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  any other reason
74f0: 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63 61 6e  ..** Cursors can
7500: 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65 20 72   move when the r
7510: 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f 69 6e  ow they are poin
7520: 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c 65 74  ting at is delet
7530: 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d 20 75  ed out.** from u
7540: 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72 20 65  nder them, for e
7550: 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f 72 20  xample.  Cursor 
7560: 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76 65 20  might also move 
7570: 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20 69 73  if a btree.** is
7580: 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a   rebalanced..**.
7590: 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
75a0: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 4e  routine with a N
75b0: 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  ULL cursor point
75c0: 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  er returns false
75d0: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
75e0: 73 65 70 61 72 61 74 65 20 73 71 6c 69 74 65 33  separate sqlite3
75f0: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7600: 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74 6f 20  re() routine to 
7610: 72 65 73 74 6f 72 65 20 61 20 63 75 72 73 6f 72  restore a cursor
7620: 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68 65 72  .** back to wher
7630: 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20 62 65  e it ought to be
7640: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
7650: 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e 0a 2a   returns true..*
7660: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
7670: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7680: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
7690: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
76a0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
76b0: 28 70 43 75 72 29 0a 20 20 20 20 20 20 20 7c 7c  (pCur).       ||
76c0: 20 70 43 75 72 3d 3d 73 71 6c 69 74 65 33 42 74   pCur==sqlite3Bt
76d0: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
76e0: 6f 72 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  or() );.  assert
76f0: 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72  ( offsetof(BtCur
7700: 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d 30 20  sor, eState)==0 
7710: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
7720: 65 6f 66 28 70 43 75 72 2d 3e 65 53 74 61 74 65  eof(pCur->eState
7730: 29 3d 3d 31 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==1 );.  return
7740: 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 21 3d   CURSOR_VALID !=
7750: 20 2a 28 75 38 2a 29 70 43 75 72 3b 0a 7d 0a 0a   *(u8*)pCur;.}..
7760: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
7770: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 61 6b 65  ointer to a fake
7780: 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
7790: 20 74 68 61 74 20 77 69 6c 6c 20 61 6c 77 61 79   that will alway
77a0: 73 20 61 6e 73 77 65 72 0a 2a 2a 20 66 61 6c 73  s answer.** fals
77b0: 65 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  e to the sqlite3
77c0: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
77d0: 76 65 64 28 29 20 72 6f 75 74 69 6e 65 20 61 62  ved() routine ab
77e0: 6f 76 65 2e 20 20 54 68 65 20 66 61 6b 65 0a 2a  ove.  The fake.*
77f0: 2a 20 63 75 72 73 6f 72 20 72 65 74 75 72 6e 65  * cursor returne
7800: 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
7810: 65 64 20 77 69 74 68 20 61 6e 79 20 6f 74 68 65  ed with any othe
7820: 72 20 42 74 72 65 65 20 69 6e 74 65 72 66 61 63  r Btree interfac
7830: 65 2e 0a 2a 2f 0a 42 74 43 75 72 73 6f 72 20 2a  e..*/.BtCursor *
7840: 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65  sqlite3BtreeFake
7850: 56 61 6c 69 64 43 75 72 73 6f 72 28 76 6f 69 64  ValidCursor(void
7860: 29 7b 0a 20 20 73 74 61 74 69 63 20 75 38 20 66  ){.  static u8 f
7870: 61 6b 65 43 75 72 73 6f 72 20 3d 20 43 55 52 53  akeCursor = CURS
7880: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 61 73 73 65  OR_VALID;.  asse
7890: 72 74 28 20 6f 66 66 73 65 74 6f 66 28 42 74 43  rt( offsetof(BtC
78a0: 75 72 73 6f 72 2c 20 65 53 74 61 74 65 29 3d 3d  ursor, eState)==
78b0: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 42  0 );.  return (B
78c0: 74 43 75 72 73 6f 72 2a 29 26 66 61 6b 65 43 75  tCursor*)&fakeCu
78d0: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
78e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 74  his routine rest
78f0: 6f 72 65 73 20 61 20 63 75 72 73 6f 72 20 62 61  ores a cursor ba
7900: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
7910: 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61 66 74 65  al position afte
7920: 72 20 69 74 0a 2a 2a 20 68 61 73 20 62 65 65 6e  r it.** has been
7930: 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d 65 20 6f   moved by some o
7940: 75 74 73 69 64 65 20 61 63 74 69 76 69 74 79 20  utside activity 
7950: 28 73 75 63 68 20 61 73 20 61 20 62 74 72 65 65  (such as a btree
7960: 20 72 65 62 61 6c 61 6e 63 65 20 6f 72 0a 2a 2a   rebalance or.**
7970: 20 61 20 72 6f 77 20 68 61 76 69 6e 67 20 62 65   a row having be
7980: 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
7990: 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
79a0: 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 4f  rsor).  .**.** O
79b0: 6e 20 73 75 63 63 65 73 73 2c 20 74 68 65 20 2a  n success, the *
79c0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 70 61  pDifferentRow pa
79d0: 72 61 6d 65 74 65 72 20 69 73 20 66 61 6c 73 65  rameter is false
79e0: 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
79f0: 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69  s left.** pointi
7a00: 6e 67 20 61 74 20 65 78 61 63 74 6c 79 20 74 68  ng at exactly th
7a10: 65 20 73 61 6d 65 20 72 6f 77 2e 20 20 2a 70 44  e same row.  *pD
7a20: 69 66 66 65 72 6e 74 52 6f 77 20 69 73 20 74 68  ifferntRow is th
7a30: 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f 72  e row the cursor
7a40: 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74 69 6e 67  .** was pointing
7a50: 20 74 6f 20 68 61 73 20 62 65 65 6e 20 64 65 6c   to has been del
7a60: 65 74 65 64 2c 20 66 6f 72 63 69 6e 67 20 74 68  eted, forcing th
7a70: 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
7a80: 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20 6e 65 61  t to some.** nea
7a90: 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54  rby row..**.** T
7aa0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
7ab0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
7ac0: 64 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74  d for a cursor t
7ad0: 68 61 74 20 6a 75 73 74 20 72 65 74 75 72 6e 65  hat just returne
7ae0: 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f 6d 20 73  d.** TRUE from s
7af0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7b00: 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a 2a 2f 0a  rHasMoved()..*/.
7b10: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
7b20: 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 42 74  CursorRestore(Bt
7b30: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7b40: 74 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  t *pDifferentRow
7b50: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
7b60: 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
7b70: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
7b80: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7b90: 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20  R_VALID );.  rc 
7ba0: 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
7bb0: 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
7bc0: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
7bd0: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7be0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
7bf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
7c00: 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
7c10: 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  _VALID ){.    *p
7c20: 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20 31  DifferentRow = 1
7c30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
7c40: 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20 3d 20  pDifferentRow = 
7c50: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
7c60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
7c70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7c80: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
7c90: 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20 68 69  /*.** Provide hi
7ca0: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7cb0: 72 2e 20 20 54 68 65 20 70 61 72 74 69 63 75 6c  r.  The particul
7cc0: 61 72 20 68 69 6e 74 20 67 69 76 65 6e 20 28 61  ar hint given (a
7cd0: 6e 64 20 74 68 65 20 74 79 70 65 0a 2a 2a 20 61  nd the type.** a
7ce0: 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  nd number of the
7cf0: 20 76 61 72 61 72 67 73 20 70 61 72 61 6d 65 74   varargs paramet
7d00: 65 72 73 29 20 69 73 20 64 65 74 65 72 6d 69 6e  ers) is determin
7d10: 65 64 20 62 79 20 74 68 65 20 65 48 69 6e 74 54  ed by the eHintT
7d20: 79 70 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ype.** parameter
7d30: 2e 20 20 53 65 65 20 74 68 65 20 64 65 66 69 6e  .  See the defin
7d40: 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 42 54  itions of the BT
7d50: 52 45 45 5f 48 49 4e 54 5f 2a 20 6d 61 63 72 6f  REE_HINT_* macro
7d60: 73 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  s for details..*
7d70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7d80: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 28 42 74  reeCursorHint(Bt
7d90: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
7da0: 74 20 65 48 69 6e 74 54 79 70 65 2c 20 2e 2e 2e  t eHintType, ...
7db0: 29 7b 0a 20 20 2f 2a 20 55 73 65 64 20 6f 6e 6c  ){.  /* Used onl
7dc0: 79 20 62 79 20 73 79 73 74 65 6d 20 74 68 61 74  y by system that
7dd0: 20 73 75 62 73 74 69 74 75 74 65 20 74 68 65 69   substitute thei
7de0: 72 20 6f 77 6e 20 73 74 6f 72 61 67 65 20 65 6e  r own storage en
7df0: 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65 6e 64 69 66  gine */.}.#endif
7e00: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
7e10: 66 6c 61 67 20 68 69 6e 74 73 20 74 6f 20 74 68  flag hints to th
7e20: 65 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  e cursor..*/.voi
7e30: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  d sqlite3BtreeCu
7e40: 72 73 6f 72 48 69 6e 74 46 6c 61 67 73 28 42 74  rsorHintFlags(Bt
7e50: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 6e  Cursor *pCur, un
7e60: 73 69 67 6e 65 64 20 78 29 7b 0a 20 20 61 73 73  signed x){.  ass
7e70: 65 72 74 28 20 78 3d 3d 42 54 52 45 45 5f 53 45  ert( x==BTREE_SE
7e80: 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d 42 54 52 45  EK_EQ || x==BTRE
7e90: 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c 7c 20 78 3d  E_BULKLOAD || x=
7ea0: 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e 68 69  =0 );.  pCur->hi
7eb0: 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a 0a 23 69 66  nts = x;.}...#if
7ec0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
7ed0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
7ee0: 2a 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e  * Given a page n
7ef0: 75 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c  umber of a regul
7f00: 61 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ar database page
7f10: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67  , return the pag
7f20: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20  e.** number for 
7f30: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
7f40: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
7f50: 6e 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72  ns the entry for
7f60: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61   the.** input pa
7f70: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ge number..**.**
7f80: 20 52 65 74 75 72 6e 20 30 20 28 6e 6f 74 20 61   Return 0 (not a
7f90: 20 76 61 6c 69 64 20 70 61 67 65 29 20 66 6f 72   valid page) for
7fa0: 20 70 67 6e 6f 3d 3d 31 20 73 69 6e 63 65 20 74   pgno==1 since t
7fb0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 70 6f  here is.** no po
7fc0: 69 6e 74 65 72 20 6d 61 70 20 61 73 73 6f 63 69  inter map associ
7fd0: 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20 31  ated with page 1
7fe0: 2e 20 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  .  The integrity
7ff0: 5f 63 68 65 63 6b 20 6c 6f 67 69 63 0a 2a 2a 20  _check logic.** 
8000: 72 65 71 75 69 72 65 73 20 74 68 61 74 20 70 74  requires that pt
8010: 72 6d 61 70 50 61 67 65 6e 6f 28 2a 2c 31 29 21  rmapPageno(*,1)!
8020: 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  =1..*/.static Pg
8030: 6e 6f 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  no ptrmapPageno(
8040: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
8050: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
8060: 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67   nPagesPerMapPag
8070: 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72 4d 61  e;.  Pgno iPtrMa
8080: 70 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74  p, ret;.  assert
8090: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
80a0: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
80b0: 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3c 32   );.  if( pgno<2
80c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
80d0: 50 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 20  PagesPerMapPage 
80e0: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
80f0: 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50 74 72 4d  ze/5)+1;.  iPtrM
8100: 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29 2f 6e 50  ap = (pgno-2)/nP
8110: 61 67 65 73 50 65 72 4d 61 70 50 61 67 65 3b 0a  agesPerMapPage;.
8120: 20 20 72 65 74 20 3d 20 28 69 50 74 72 4d 61 70    ret = (iPtrMap
8130: 2a 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  *nPagesPerMapPag
8140: 65 29 20 2b 20 32 3b 20 0a 20 20 69 66 28 20 72  e) + 2; .  if( r
8150: 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et==PENDING_BYTE
8160: 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
8170: 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72    ret++;.  }.  r
8180: 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
8190: 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 65 6e 74  .** Write an ent
81a0: 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e  ry into the poin
81b0: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
81c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 75 70 64 61  his routine upda
81d0: 74 65 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20  tes the pointer 
81e0: 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61  map entry for pa
81f0: 67 65 20 6e 75 6d 62 65 72 20 27 6b 65 79 27 0a  ge number 'key'.
8200: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 6d 61  ** so that it ma
8210: 70 73 20 74 6f 20 74 79 70 65 20 27 65 54 79 70  ps to type 'eTyp
8220: 65 27 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  e' and parent pa
8230: 67 65 20 6e 75 6d 62 65 72 20 27 70 67 6e 6f 27  ge number 'pgno'
8240: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 52 43 20  ..**.** If *pRC 
8250: 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 6f 6e  is initially non
8260: 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53 51 4c 49 54  -zero (non-SQLIT
8270: 45 5f 4f 4b 29 20 74 68 65 6e 20 74 68 69 73 20  E_OK) then this 
8280: 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 61 20  routine is.** a 
8290: 6e 6f 2d 6f 70 2e 20 20 49 66 20 61 6e 20 65 72  no-op.  If an er
82a0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
82b0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
82c0: 72 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  r code is writte
82d0: 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 52 43 2e 0a  n.** into *pRC..
82e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
82f0: 74 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65  trmapPut(BtShare
8300: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79  d *pBt, Pgno key
8310: 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f  , u8 eType, Pgno
8320: 20 70 61 72 65 6e 74 2c 20 69 6e 74 20 2a 70 52   parent, int *pR
8330: 43 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  C){.  DbPage *pD
8340: 62 50 61 67 65 3b 20 20 2f 2a 20 54 68 65 20 70  bPage;  /* The p
8350: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8360: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8370: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ;      /* The po
8380: 69 6e 74 65 72 20 6d 61 70 20 64 61 74 61 20 2a  inter map data *
8390: 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 6d 61 70  /.  Pgno iPtrmap
83a0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ;     /* The poi
83b0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 6e 75  nter map page nu
83c0: 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mber */.  int of
83d0: 66 73 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f  fset;       /* O
83e0: 66 66 73 65 74 20 69 6e 20 70 6f 69 6e 74 65 72  ffset in pointer
83f0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
8400: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8410: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
8420: 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
8430: 73 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43  s */..  if( *pRC
8440: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
8450: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8460: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8470: 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65  tex) );.  /* The
8480: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
8490: 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  page number must
84a0: 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20 61   never be used a
84b0: 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  s a pointer map 
84c0: 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  page */.  assert
84d0: 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50 41  ( 0==PTRMAP_ISPA
84e0: 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47 5f  GE(pBt, PENDING_
84f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29 20  BYTE_PAGE(pBt)) 
8500: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 42  );..  assert( pB
8510: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b  t->autoVacuum );
8520: 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29 7b  .  if( key==0 ){
8530: 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
8540: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
8550: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8560: 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52  .  iPtrmap = PTR
8570: 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
8580: 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  key);.  rc = sql
8590: 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
85a0: 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61  ->pPager, iPtrma
85b0: 70 2c 20 26 70 44 62 50 61 67 65 2c 20 30 29 3b  p, &pDbPage, 0);
85c0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
85d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
85e0: 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
85f0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 28 63  n;.  }.  if( ((c
8600: 68 61 72 2a 29 73 71 6c 69 74 65 33 50 61 67 65  har*)sqlite3Page
8610: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
8620: 65 29 29 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20  e))[0]!=0 ){.   
8630: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 62 79   /* The first by
8640: 74 65 20 6f 66 20 74 68 65 20 65 78 74 72 61 20  te of the extra 
8650: 64 61 74 61 20 69 73 20 74 68 65 20 4d 65 6d 50  data is the MemP
8660: 61 67 65 2e 69 73 49 6e 69 74 20 62 79 74 65 2e  age.isInit byte.
8670: 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 61 74 20  .    ** If that 
8680: 62 79 74 65 20 69 73 20 73 65 74 2c 20 69 74 20  byte is set, it 
8690: 6d 65 61 6e 73 20 74 68 69 73 20 70 61 67 65 20  means this page 
86a0: 69 73 20 61 6c 73 6f 20 62 65 69 6e 67 20 75 73  is also being us
86b0: 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 62  ed.    ** as a b
86c0: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
86d0: 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
86e0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
86f0: 20 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78    goto ptrmap_ex
8700: 69 74 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  it;.  }.  offset
8710: 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46 46   = PTRMAP_PTROFF
8720: 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65 79  SET(iPtrmap, key
8730: 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  );.  if( offset<
8740: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
8750: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
8760: 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70 74  KPT;.    goto pt
8770: 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a 20  rmap_exit;.  }. 
8780: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
8790: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
87a0: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 70  bleSize-5 );.  p
87b0: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
87c0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
87d0: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
87e0: 69 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d  if( eType!=pPtrm
87f0: 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65  ap[offset] || ge
8800: 74 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b  t4byte(&pPtrmap[
8810: 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65  offset+1])!=pare
8820: 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28  nt ){.    TRACE(
8830: 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a  ("PTRMAP_UPDATE:
8840: 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c   %d->(%d,%d)\n",
8850: 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72   key, eType, par
8860: 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70 52 43 3d  ent));.    *pRC=
8870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
8880: 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65 29  erWrite(pDbPage)
8890: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
88a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
88b0: 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d   pPtrmap[offset]
88c0: 20 3d 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20   = eType;.      
88d0: 70 75 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  put4byte(&pPtrma
88e0: 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20 70 61 72  p[offset+1], par
88f0: 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
8900: 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a 0a 20 20  .ptrmap_exit:.  
8910: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
8920: 66 28 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  f(pDbPage);.}../
8930: 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20 65 6e 74  *.** Read an ent
8940: 72 79 20 66 72 6f 6d 20 74 68 65 20 70 6f 69 6e  ry from the poin
8950: 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54  ter map..**.** T
8960: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 72  his routine retr
8970: 69 65 76 65 73 20 74 68 65 20 70 6f 69 6e 74 65  ieves the pointe
8980: 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20  r map entry for 
8990: 70 61 67 65 20 27 6b 65 79 27 2c 20 77 72 69 74  page 'key', writ
89a0: 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79 70 65 20  ing.** the type 
89b0: 61 6e 64 20 70 61 72 65 6e 74 20 70 61 67 65 20  and parent page 
89c0: 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45 54 79 70  number to *pETyp
89d0: 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 72 65 73  e and *pPgno res
89e0: 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e  pectively..** An
89f0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
8a00: 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65 74  eturned if somet
8a10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
8a20: 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54   otherwise SQLIT
8a30: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
8a40: 69 6e 74 20 70 74 72 6d 61 70 47 65 74 28 42 74  int ptrmapGet(Bt
8a50: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
8a60: 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45 54 79 70  o key, u8 *pETyp
8a70: 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b  e, Pgno *pPgno){
8a80: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
8a90: 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  ge;   /* The poi
8aa0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
8ab0: 0a 20 20 69 6e 74 20 69 50 74 72 6d 61 70 3b 20  .  int iPtrmap; 
8ac0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8ad0: 20 6d 61 70 20 70 61 67 65 20 69 6e 64 65 78 20   map page index 
8ae0: 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72 6d 61 70  */.  u8 *pPtrmap
8af0: 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  ;       /* Point
8b00: 65 72 20 6d 61 70 20 70 61 67 65 20 64 61 74 61  er map page data
8b10: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
8b20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  ;        /* Offs
8b30: 65 74 20 6f 66 20 65 6e 74 72 79 20 69 6e 20 70  et of entry in p
8b40: 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f 0a 20 20  ointer map */.  
8b50: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
8b60: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
8b70: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
8b80: 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d 61 70 20  ) );..  iPtrmap 
8b90: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
8ba0: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
8bb0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
8bc0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
8bd0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
8be0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
8bf0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
8c00: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
8c10: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
8c20: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
8c30: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
8c40: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
8c50: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
8c60: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
8c70: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
8c80: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
8c90: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
8ca0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8cb0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
8cc0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
8cd0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
8ce0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8cf0: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8d00: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8d10: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8d20: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8d30: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8d40: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8d50: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8d60: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8d70: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8d80: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
8d90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8da0: 52 55 50 54 5f 50 47 4e 4f 28 69 50 74 72 6d 61  RUPT_PGNO(iPtrma
8db0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
8dc0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65  ITE_OK;.}..#else
8dd0: 20 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53   /* if defined S
8de0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
8df0: 41 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69  ACUUM */.  #defi
8e00: 6e 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78  ne ptrmapPut(w,x
8e10: 2c 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69  ,y,z,rc).  #defi
8e20: 6e 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78  ne ptrmapGet(w,x
8e30: 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a  ,y,z) SQLITE_OK.
8e40: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8e50: 50 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c  PutOvflPtr(x, y,
8e60: 20 7a 2c 20 72 63 29 0a 23 65 6e 64 69 66 0a 0a   z, rc).#endif..
8e70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74  /*.** Given a bt
8e80: 72 65 65 20 70 61 67 65 20 61 6e 64 20 61 20 63  ree page and a c
8e90: 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61  ell index (0 mea
8ea0: 6e 73 20 74 68 65 20 66 69 72 73 74 20 63 65 6c  ns the first cel
8eb0: 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  l on.** the page
8ec0: 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65  , 1 means the se
8ed0: 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73  cond cell, and s
8ee0: 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20  o forth) return 
8ef0: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
8f00: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
8f10: 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c  ..**.** findCell
8f20: 50 61 73 74 50 74 72 28 29 20 64 6f 65 73 20 74  PastPtr() does t
8f30: 68 65 20 73 61 6d 65 20 65 78 63 65 70 74 20 69  he same except i
8f40: 74 20 73 6b 69 70 73 20 70 61 73 74 20 74 68 65  t skips past the
8f50: 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 34 2d 62 79   initial.** 4-by
8f60: 74 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  te child pointer
8f70: 20 66 6f 75 6e 64 20 6f 6e 20 69 6e 74 65 72 69   found on interi
8f80: 6f 72 20 70 61 67 65 73 2c 20 69 66 20 74 68 65  or pages, if the
8f90: 72 65 20 69 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a  re is one..**.**
8fa0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f   This routine wo
8fb0: 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70 61 67  rks only for pag
8fc0: 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 63  es that do not c
8fd0: 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20  ontain overflow 
8fe0: 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cells..*/.#defin
8ff0: 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49 29 20  e findCell(P,I) 
9000: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 20  \.  ((P)->aData 
9010: 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65  + ((P)->maskPage
9020: 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   & get2byteAlign
9030: 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64  ed(&(P)->aCellId
9040: 78 5b 32 2a 28 49 29 5d 29 29 29 0a 23 64 65 66  x[2*(I)]))).#def
9050: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  ine findCellPast
9060: 50 74 72 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  Ptr(P,I) \.  ((P
9070: 29 2d 3e 61 44 61 74 61 4f 66 73 74 20 2b 20 28  )->aDataOfst + (
9080: 28 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20  (P)->maskPage & 
9090: 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28  get2byteAligned(
90a0: 26 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32  &(P)->aCellIdx[2
90b0: 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a  *(I)]))).../*.**
90c0: 20 54 68 69 73 20 69 73 20 63 6f 6d 6d 6f 6e 20   This is common 
90d0: 74 61 69 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  tail processing 
90e0: 66 6f 72 20 62 74 72 65 65 50 61 72 73 65 43 65  for btreeParseCe
90f0: 6c 6c 50 74 72 28 29 20 61 6e 64 0a 2a 2a 20 62  llPtr() and.** b
9100: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
9110: 49 6e 64 65 78 28 29 20 66 6f 72 20 74 68 65 20  Index() for the 
9120: 63 61 73 65 20 77 68 65 6e 20 74 68 65 20 63 65  case when the ce
9130: 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 66 69 74 20  ll does not fit 
9140: 65 6e 74 69 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61  entirely.** on a
9150: 20 73 69 6e 67 6c 65 20 42 2d 74 72 65 65 20 70   single B-tree p
9160: 61 67 65 2e 20 20 4d 61 6b 65 20 6e 65 63 65 73  age.  Make neces
9170: 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 73  sary adjustments
9180: 20 74 6f 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f   to the CellInfo
9190: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  .** structure..*
91a0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
91b0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 62 74  NOINLINE void bt
91c0: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
91d0: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
91e0: 77 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  w(.  MemPage *pP
91f0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9200: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9210: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9220: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9230: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9240: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9250: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9260: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9270: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9280: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9290: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c    /* If the payl
92a0: 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  oad will not fit
92b0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74   completely on t
92c0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77  he local page, w
92d0: 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
92e0: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
92f0: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
9300: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
9310: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20  spill onto.  ** 
9320: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
9330: 20 54 68 65 20 73 74 72 61 74 65 67 79 20 69 73   The strategy is
9340: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74 68 65   to minimize the
9350: 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75 73 65   amount of unuse
9360: 64 0a 20 20 2a 2a 20 73 70 61 63 65 20 6f 6e 20  d.  ** space on 
9370: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 77  overflow pages w
9380: 68 69 6c 65 20 6b 65 65 70 69 6e 67 20 74 68 65  hile keeping the
9390: 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 6f 63 61 6c   amount of local
93a0: 20 73 74 6f 72 61 67 65 0a 20 20 2a 2a 20 69 6e   storage.  ** in
93b0: 20 62 65 74 77 65 65 6e 20 6d 69 6e 4c 6f 63 61   between minLoca
93c0: 6c 20 61 6e 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a  l and maxLocal..
93d0: 20 20 2a 2a 0a 20 20 2a 2a 20 57 61 72 6e 69 6e    **.  ** Warnin
93e0: 67 3a 20 20 63 68 61 6e 67 69 6e 67 20 74 68 65  g:  changing the
93f0: 20 77 61 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   way overflow pa
9400: 79 6c 6f 61 64 20 69 73 20 64 69 73 74 72 69 62  yload is distrib
9410: 75 74 65 64 20 69 6e 20 61 6e 79 0a 20 20 2a 2a  uted in any.  **
9420: 20 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74   way will result
9430: 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69   in an incompati
9440: 62 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e  ble file format.
9450: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c  .  */.  int minL
9460: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
9470: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
9480: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
9490: 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 4c 6f 63   */.  int maxLoc
94a0: 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20  al;  /* Maximum 
94b0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
94c0: 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a  d held locally *
94d0: 2f 0a 20 20 69 6e 74 20 73 75 72 70 6c 75 73 3b  /.  int surplus;
94e0: 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70     /* Overflow p
94f0: 61 79 6c 6f 61 64 20 61 76 61 69 6c 61 62 6c 65  ayload available
9500: 20 66 6f 72 20 6c 6f 63 61 6c 20 73 74 6f 72 61   for local stora
9510: 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61  ge */..  minLoca
9520: 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  l = pPage->minLo
9530: 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f 63 61 6c 20  cal;.  maxLocal 
9540: 3d 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  = pPage->maxLoca
9550: 6c 3b 0a 20 20 73 75 72 70 6c 75 73 20 3d 20 6d  l;.  surplus = m
9560: 69 6e 4c 6f 63 61 6c 20 2b 20 28 70 49 6e 66 6f  inLocal + (pInfo
9570: 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 69 6e  ->nPayload - min
9580: 4c 6f 63 61 6c 29 25 28 70 50 61 67 65 2d 3e 70  Local)%(pPage->p
9590: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
95a0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
95b0: 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c  urplus==maxLocal
95c0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
95d0: 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61  surplus==maxLoca
95e0: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 73 75 72  l+1 );.  if( sur
95f0: 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c  plus <= maxLocal
9600: 20 29 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   ){.    pInfo->n
9610: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 73 75 72  Local = (u16)sur
9620: 70 6c 75 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  plus;.  }else{. 
9630: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9640: 20 3d 20 28 75 31 36 29 6d 69 6e 4c 6f 63 61 6c   = (u16)minLocal
9650: 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e  ;.  }.  pInfo->n
9660: 53 69 7a 65 20 3d 20 28 75 31 36 29 28 26 70 49  Size = (u16)(&pI
9670: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49  nfo->pPayload[pI
9680: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70  nfo->nLocal] - p
9690: 43 65 6c 6c 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  Cell) + 4;.}../*
96a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
96b0: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
96c0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
96d0: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
96e0: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
96f0: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
9700: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
9710: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
9720: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
9730: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
9740: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
9750: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
9760: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
9770: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
9780: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
9790: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
97a0: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
97b0: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
97c0: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
97d0: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
97e0: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
97f0: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
9800: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
9810: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
9820: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
9830: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
9840: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
9850: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
9860: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
9870: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
9880: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
9890: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
98a0: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
98b0: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
98c0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
98d0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
98e0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
98f0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9900: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9910: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9920: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9930: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9940: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9950: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9960: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9970: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9980: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
99a0: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
99b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
99c0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
99d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
99e0: 45 5f 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44  E_DEBUG.  UNUSED
99f0: 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67 65  _PARAMETER(pPage
9a00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66  );.#endif.  pInf
9a10: 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67  o->nSize = 4 + g
9a20: 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  etVarint(&pCell[
9a30: 34 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f  4], (u64*)&pInfo
9a40: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f  ->nKey);.  pInfo
9a50: 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a  ->nPayload = 0;.
9a60: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
9a70: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  = 0;.  pInfo->pP
9a80: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72 65  ayload = 0;.  re
9a90: 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20 76  turn;.}.static v
9aa0: 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65  oid btreeParseCe
9ab0: 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67 65  llPtr(.  MemPage
9ac0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
9ad0: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
9ae0: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
9af0: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
9b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
9b10: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
9b20: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
9b30: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9b40: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9b50: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9b60: 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b  .){.  u8 *pIter;
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b80: 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68   For scanning th
9b90: 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20  rough pCell */. 
9ba0: 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20   u32 nPayload;  
9bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9bc0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63  er of bytes of c
9bd0: 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  ell payload */. 
9be0: 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20 20   u64 iKey;      
9bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
9c00: 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65 20  acted Key value 
9c10: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9c20: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9c30: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
9c40: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
9c50: 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20   pPage->leaf==0 
9c60: 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  || pPage->leaf==
9c70: 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
9c80: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
9c90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9ca0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9cb0: 65 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20  e==0 );.  pIter 
9cc0: 3d 20 70 43 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54  = pCell;..  /* T
9cd0: 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66  he next block of
9ce0: 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c   code is equival
9cf0: 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a  ent to:.  **.  *
9d00: 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67  *     pIter += g
9d10: 65 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72  etVarint32(pIter
9d20: 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 2a  , nPayload);.  *
9d30: 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64 65 20  *.  ** The code 
9d40: 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76  is inlined to av
9d50: 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e 20 63  oid a function c
9d60: 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 6e 50 61 79  all..  */.  nPay
9d70: 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20  load = *pIter;. 
9d80: 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30   if( nPayload>=0
9d90: 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  x80 ){.    u8 *p
9da0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b  End = &pIter[8];
9db0: 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d  .    nPayload &=
9dc0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
9dd0: 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20       nPayload = 
9de0: 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20  (nPayload<<7) | 
9df0: 28 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66  (*++pIter & 0x7f
9e00: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  );.    }while( (
9e10: 2a 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26  *pIter)>=0x80 &&
9e20: 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20   pIter<pEnd );. 
9e30: 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20   }.  pIter++;.. 
9e40: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9e50: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9e60: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9e70: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9e80: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 70 49   += getVarint(pI
9e90: 74 65 72 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  ter, (u64*)&pInf
9ea0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20  o->nKey);.  **. 
9eb0: 20 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20   ** The code is 
9ec0: 69 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64  inlined to avoid
9ed0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c   a function call
9ee0: 2e 0a 20 20 2a 2f 0a 20 20 69 4b 65 79 20 3d 20  ..  */.  iKey = 
9ef0: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 69 4b  *pIter;.  if( iK
9f00: 65 79 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ey>=0x80 ){.    
9f10: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9f20: 72 5b 37 5d 3b 0a 20 20 20 20 69 4b 65 79 20 26  r[7];.    iKey &
9f30: 3d 20 30 78 37 66 3b 0a 20 20 20 20 77 68 69 6c  = 0x7f;.    whil
9f40: 65 28 31 29 7b 0a 20 20 20 20 20 20 69 4b 65 79  e(1){.      iKey
9f50: 20 3d 20 28 69 4b 65 79 3c 3c 37 29 20 7c 20 28   = (iKey<<7) | (
9f60: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
9f70: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 70 49  ;.      if( (*pI
9f80: 74 65 72 29 3c 30 78 38 30 20 29 20 62 72 65 61  ter)<0x80 ) brea
9f90: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  k;.      if( pIt
9fa0: 65 72 3e 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20  er>=pEnd ){.    
9fb0: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9fc0: 3c 3c 38 29 20 7c 20 2a 2b 2b 70 49 74 65 72 3b  <<8) | *++pIter;
9fd0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9fe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9ff0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20  }.  pIter++;..  
a000: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28  pInfo->nKey = *(
a010: 69 36 34 2a 29 26 69 4b 65 79 3b 0a 20 20 70 49  i64*)&iKey;.  pI
a020: 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20  nfo->nPayload = 
a030: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66  nPayload;.  pInf
a040: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49  o->pPayload = pI
a050: 74 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ter;.  testcase(
a060: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
a070: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a080: 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f  testcase( nPaylo
a090: 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad==pPage->maxLo
a0a0: 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e  cal+1 );.  if( n
a0b0: 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e  Payload<=pPage->
a0c0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a0d0: 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28  /* This is the (
a0e0: 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73  easy) common cas
a0f0: 65 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69  e where the enti
a100: 72 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a  re payload fits.
a110: 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f      ** on the lo
a120: 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76  cal page.  No ov
a130: 65 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72  erflow is requir
a140: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ed..    */.    p
a150: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50  Info->nSize = nP
a160: 61 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70  ayload + (u16)(p
a170: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
a180: 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53     if( pInfo->nS
a190: 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e  ize<4 ) pInfo->n
a1a0: 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49  Size = 4;.    pI
a1b0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
a1c0: 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d  16)nPayload;.  }
a1d0: 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50  else{.    btreeP
a1e0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
a1f0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50  zeForOverflow(pP
a200: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66  age, pCell, pInf
a210: 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  o);.  }.}.static
a220: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
a230: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20  CellPtrIndex(.  
a240: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a250: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a260: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a270: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
a280: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a290: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
a2a0: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
a2b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
a2c0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
a2d0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
a2e0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
a2f0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
a300: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
a310: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
a320: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
a330: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
a340: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
a350: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
a360: 61 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ad */..  assert(
a370: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
a380: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
a390: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
a3a0: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
a3b0: 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61  =0 || pPage->lea
a3c0: 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  f==1 );.  assert
a3d0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
a3e0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  eaf==0 );.  pIte
a3f0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
a400: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
a410: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
a420: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
a430: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
a440: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
a450: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
a460: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
a470: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
a480: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
a490: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
a4a0: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
a4b0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
a4c0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
a4d0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
a4e0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
a4f0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
a500: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
a510: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
a520: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
a530: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
a540: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
a550: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
a570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
a580: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
a590: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
a5a0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a5b0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
a5c0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
a5d0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
a5e0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
a5f0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
a600: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
a610: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
a620: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
a630: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
a640: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
a650: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a660: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
a670: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
a680: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
a690: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
a6a0: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
a6b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72    }else{.    btr
a6c0: 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73  eeParseCellAdjus
a6d0: 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77  tSizeForOverflow
a6e0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70  (pPage, pCell, p
a6f0: 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61  Info);.  }.}.sta
a700: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
a710: 72 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  rseCell(.  MemPa
a720: 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
a730: 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
a740: 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a  ining the cell *
a750: 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20  /.  int iCell,  
a760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a770: 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20  he cell index.  
a780: 46 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20  First cell is 0 
a790: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
a7a0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
a7b0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
a7c0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70  ucture */.){.  p
a7d0: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
a7e0: 28 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c  (pPage, findCell
a7f0: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20  (pPage, iCell), 
a800: 70 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pInfo);.}../*.**
a810: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
a820: 6f 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c  outines are impl
a830: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74  ementations of t
a840: 68 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c  he MemPage.xCell
a850: 53 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a  Size.** method..
a860: 2a 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  **.** Compute th
a870: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
a880: 66 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43  f bytes that a C
a890: 65 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65  ell needs in the
a8a0: 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72   cell.** data ar
a8b0: 65 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d  ea of the btree-
a8c0: 70 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72  page.  The retur
a8d0: 6e 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65  n number include
a8e0: 73 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  s the cell.** da
a8f0: 74 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68  ta header and th
a900: 65 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c  e local payload,
a910: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65   but not any ove
a920: 72 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a  rflow page or.**
a930: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
a940: 62 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  by the cell poin
a950: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53  ter..**.** cellS
a960: 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28  izePtrNoPayload(
a970: 29 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20  )    =>   table 
a980: 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a  internal nodes.*
a990: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  * cellSizePtr() 
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20              =>  
a9b0: 20 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73   all index nodes
a9c0: 20 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f   & table leaf no
a9d0: 64 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  des.*/.static u1
a9e0: 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65  6 cellSizePtr(Me
a9f0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
aa00: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
aa10: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
aa20: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
aa30: 69 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  ize; /* For loop
aa40: 69 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f  ing over bytes o
aa50: 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  f pCell */.  u8 
aa60: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72        /* End mar
aa90: 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a  k for a varint *
aaa0: 2f 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20  /.  u32 nSize;  
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
aad0: 53 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65  Size value to re
aae0: 74 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  turn */..#ifdef 
aaf0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
ab00: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ab10: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
ab20: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
ab30: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
ab40: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
ab50: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
ab60: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
ab70: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
ab80: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
ab90: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
aba0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
abb0: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
abc0: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
abd0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
abe0: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
abf0: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
ac00: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
ac10: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
ac20: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
ac30: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
ac40: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
ac50: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 6e 53 69  );.#endif..  nSi
ac60: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
ac70: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
ac80: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
ac90: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
aca0: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
acb0: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
acc0: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
acd0: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
ace0: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
acf0: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
ad00: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
ad10: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
ad20: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
ad30: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
ad40: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
ad50: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
ad60: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
ad70: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
ad80: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
ad90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
ada0: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
adb0: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
adc0: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
add0: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
ade0: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
adf0: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
ae00: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
ae10: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
ae20: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
ae30: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
ae40: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
ae50: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
ae60: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
ae70: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
ae80: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
ae90: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
aea0: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
aeb0: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
aec0: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
aed0: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
aee0: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
aef0: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
af00: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
af10: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
af20: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
af30: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
af40: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
af50: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
af60: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
af70: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
af80: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
af90: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
afa0: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
afb0: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
afc0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
afd0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
afe0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
aff0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
b000: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
b010: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
b020: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
b030: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
b040: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
b050: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
b060: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
b070: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
b080: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
b090: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
b0a0: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
b0b0: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
b0c0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
b0d0: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
b0e0: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
b0f0: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
b100: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
b110: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
b120: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
b130: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
b140: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
b150: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
b160: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
b170: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
b180: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
b190: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
b1a0: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
b1b0: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
b1c0: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
b1d0: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
b1e0: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
b1f0: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
b200: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
b210: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
b220: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
b230: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
b240: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
b250: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
b260: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
b270: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
b280: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
b290: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
b2a0: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
b2b0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
b2c0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
b2d0: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
b2e0: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
b2f0: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
b300: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
b310: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
b320: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
b330: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
b340: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
b350: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
b360: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
b370: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
b380: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
b390: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
b3a0: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
b3b0: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
b3c0: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
b3d0: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
b3e0: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
b3f0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
b400: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
b410: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
b420: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
b430: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
b440: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
b450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
b460: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 54  TOVACUUM./*.** T
b470: 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 20 69 73  he cell pCell is
b480: 20 63 75 72 72 65 6e 74 6c 79 20 70 61 72 74 20   currently part 
b490: 6f 66 20 70 61 67 65 20 70 53 72 63 20 62 75 74  of page pSrc but
b4a0: 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79   will ultimately
b4b0: 20 62 65 20 70 61 72 74 0a 2a 2a 20 6f 66 20 70   be part.** of p
b4c0: 50 61 67 65 2e 20 20 28 70 53 72 63 20 61 6e 64  Page.  (pSrc and
b4d0: 20 70 50 61 67 65 72 20 61 72 65 20 6f 66 74 65   pPager are ofte
b4e0: 6e 20 74 68 65 20 73 61 6d 65 2e 29 20 20 49 66  n the same.)  If
b4f0: 20 70 43 65 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   pCell contains 
b500: 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20  a.** pointer to 
b510: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
b520: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
b530: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
b540: 65 72 2d 6d 61 70 20 66 6f 72 0a 2a 2a 20 74 68  er-map for.** th
b550: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
b560: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 61 6c  that will be val
b570: 69 64 20 61 66 74 65 72 20 70 43 65 6c 6c 20 68  id after pCell h
b580: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 74 6f  as been moved to
b590: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
b5a0: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
b5b0: 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20  OvflPtr(MemPage 
b5c0: 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67 65 20  *pPage, MemPage 
b5d0: 2a 70 53 72 63 2c 20 75 38 20 2a 70 43 65 6c 6c  *pSrc, u8 *pCell
b5e0: 2c 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65  ,int *pRC){.  Ce
b5f0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
b600: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
b610: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
b620: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
b630: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
b640: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
b650: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
b660: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
b670: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
b680: 66 6c 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  fl;.    if( SQLI
b690: 54 45 5f 57 49 54 48 49 4e 28 70 53 72 63 2d 3e  TE_WITHIN(pSrc->
b6a0: 61 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c  aDataEnd, pCell,
b6b0: 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63   pCell+info.nLoc
b6c0: 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 74 65 73  al) ){.      tes
b6d0: 74 63 61 73 65 28 20 70 53 72 63 21 3d 70 50 61  tcase( pSrc!=pPa
b6e0: 67 65 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 43  ge );.      *pRC
b6f0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b700: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b710: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b720: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b730: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b740: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b750: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b760: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b770: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b780: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b790: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b7a0: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b7b0: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b7c0: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b7d0: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b7e0: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b7f0: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b800: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b810: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b820: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b830: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b840: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b850: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b860: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b870: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b880: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b890: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b8a0: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b8b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b8c0: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b8d0: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b8e0: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b8f0: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b900: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b910: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b920: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b930: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b940: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b950: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b960: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b970: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b980: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b990: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b9a0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b9b0: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b9c0: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b9d0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b9e0: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b9f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba10: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
ba20: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ba40: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
ba50: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
ba60: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
ba70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
ba80: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
ba90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
baa0: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bab0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bac0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
bad0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
bae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
baf0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
bb00: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
bb10: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
bb20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb30: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
bb40: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
bb50: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
bb80: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
bb90: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
bba0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
bbb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bbc0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
bbd0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
bbe0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
bbf0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
bc00: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
bc10: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bc20: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bc30: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bc40: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bc50: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
bc60: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bc70: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bc80: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bc90: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bca0: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bcb0: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bcc0: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bcd0: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bce0: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bcf0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bd00: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bd10: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bd20: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bd30: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bd40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bd50: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bd60: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bd70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bd80: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bd90: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bda0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bdb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bdc0: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bdd0: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bde0: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bdf0: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
be00: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
be10: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
be20: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
be30: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
be40: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
be50: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
be60: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
be70: 61 5b 68 64 72 2b 33 5d 29 20 7c 7c 20 43 4f 52  a[hdr+3]) || COR
be80: 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 69 43 65  RUPT_DB );.  iCe
be90: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
bea0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
beb0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
bec0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bed0: 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54 68 69  eSize;..  /* Thi
bee0: 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 20  s block handles 
bef0: 70 61 67 65 73 20 77 69 74 68 20 74 77 6f 20 6f  pages with two o
bf00: 72 20 66 65 77 65 72 20 66 72 65 65 20 62 6c 6f  r fewer free blo
bf10: 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72 61 67  cks and nMaxFrag
bf20: 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72 20 66  .  ** or fewer f
bf30: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 2e  ragmented bytes.
bf40: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
bf50: 20 69 73 20 66 61 73 74 65 72 20 74 6f 20 6d 6f   is faster to mo
bf60: 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  ve the.  ** two 
bf70: 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b 73 20  (or one) blocks 
bf80: 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67 20 6d  of cells using m
bf90: 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61 64 64  emmove() and add
bfa0: 20 74 68 65 20 72 65 71 75 69 72 65 64 0a 20 20   the required.  
bfb0: 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20 65 61  ** offsets to ea
bfc0: 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ch pointer in th
bfd0: 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
bfe0: 72 72 61 79 20 74 68 61 6e 20 69 74 20 69 73 20  rray than it is 
bff0: 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e 73 74  to .  ** reconst
c000: 72 75 63 74 20 74 68 65 20 65 6e 74 69 72 65 20  ruct the entire 
c010: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  page.  */.  if( 
c020: 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b 37 5d  (int)data[hdr+7]
c030: 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a 20 20  <=nMaxFrag ){.  
c040: 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20 67 65    int iFree = ge
c050: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
c060: 2b 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 46  +1]);.    if( iF
c070: 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  ree>usableSize-4
c080: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
c090: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c0a0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 69 46  age);.    if( iF
c0b0: 72 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ree ){.      int
c0c0: 20 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79   iFree2 = get2by
c0d0: 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29  te(&data[iFree])
c0e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65  ;.      if( iFre
c0f0: 65 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  e2>usableSize-4 
c100: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
c110: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c120: 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30  ge);.      if( 0
c130: 3d 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74  ==iFree2 || (dat
c140: 61 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20  a[iFree2]==0 && 
c150: 64 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d  data[iFree2+1]==
c160: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  0) ){.        u8
c170: 20 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63   *pEnd = &data[c
c180: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c  ellOffset + nCel
c190: 6c 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  l*2];.        u8
c1a0: 20 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20   *pAddr;.       
c1b0: 20 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20   int sz2 = 0;.  
c1c0: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67        int sz = g
c1d0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46  et2byte(&data[iF
c1e0: 72 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20  ree+2]);.       
c1f0: 20 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62   int top = get2b
c200: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
c210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74  );.        if( t
c220: 6f 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20  op>=iFree ){.   
c230: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c240: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c250: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c260: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c270: 69 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20  iFree2 ){.      
c280: 20 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a      if( iFree+sz
c290: 3e 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e  >iFree2 ) return
c2a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c2b0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c2c0: 20 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74         sz2 = get
c2d0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
c2e0: 65 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  e2+2]);.        
c2f0: 20 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32    if( iFree2+sz2
c300: 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20   > usableSize ) 
c310: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c320: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
c340: 6d 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65  move(&data[iFree
c350: 2b 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b  +sz+sz2], &data[
c360: 69 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65  iFree+sz], iFree
c370: 32 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20  2-(iFree+sz));. 
c380: 20 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73           sz += s
c390: 7a 32 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z2;.        }els
c3a0: 65 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e 75  e if( iFree+sz>u
c3b0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
c3c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
c3d0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
c3e0: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
c3f0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 62 72    }..        cbr
c400: 6b 20 3d 20 74 6f 70 2b 73 7a 3b 0a 20 20 20 20  k = top+sz;.    
c410: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
c420: 2b 28 69 46 72 65 65 2d 74 6f 70 29 20 3c 3d 20  +(iFree-top) <= 
c430: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
c440: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 64        memmove(&d
c450: 61 74 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61  ata[cbrk], &data
c460: 5b 74 6f 70 5d 2c 20 69 46 72 65 65 2d 74 6f 70  [top], iFree-top
c470: 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  );.        for(p
c480: 41 64 64 72 3d 26 64 61 74 61 5b 63 65 6c 6c 4f  Addr=&data[cellO
c490: 66 66 73 65 74 5d 3b 20 70 41 64 64 72 3c 70 45  ffset]; pAddr<pE
c4a0: 6e 64 3b 20 70 41 64 64 72 2b 3d 32 29 7b 0a 20  nd; pAddr+=2){. 
c4b0: 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 67 65           pc = ge
c4c0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
c4d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c           if( pc<
c4e0: 69 46 72 65 65 20 29 7b 20 70 75 74 32 62 79 74  iFree ){ put2byt
c4f0: 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a 29 3b  e(pAddr, pc+sz);
c500: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73   }.          els
c510: 65 20 69 66 28 20 70 63 3c 69 46 72 65 65 32 20  e if( pc<iFree2 
c520: 29 7b 20 70 75 74 32 62 79 74 65 28 70 41 64 64  ){ put2byte(pAdd
c530: 72 2c 20 70 63 2b 73 7a 32 29 3b 20 7d 0a 20 20  r, pc+sz2); }.  
c540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c550: 67 6f 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 5f  goto defragment_
c560: 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
c570: 20 7d 0a 20 20 7d 0a 0a 20 20 63 62 72 6b 20 3d   }.  }..  cbrk =
c580: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69   usableSize;.  i
c590: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
c5a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72  eSize - 4;.  for
c5b0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
c5c0: 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64  ++){.    u8 *pAd
c5d0: 64 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69  dr;     /* The i
c5e0: 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  -th cell pointer
c5f0: 20 2a 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20   */.    pAddr = 
c600: 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74  &data[cellOffset
c610: 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20   + i*2];.    pc 
c620: 3d 20 67 65 74 32 62 79 74 65 28 70 41 64 64 72  = get2byte(pAddr
c630: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c640: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
c650: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c660: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
c670: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63  ;.    /* These c
c680: 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61  onditions have a
c690: 6c 72 65 61 64 79 20 62 65 65 6e 20 76 65 72 69  lready been veri
c6a0: 66 69 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69  fied in btreeIni
c6b0: 74 50 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69  tPage().    ** i
c6c0: 66 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69  f PRAGMA cell_si
c6d0: 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20  ze_check=ON..   
c6e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69   */.    if( pc<i
c6f0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e  CellFirst || pc>
c700: 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20  iCellLast ){.   
c710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c720: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
c730: 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
c740: 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65 6c  assert( pc>=iCel
c750: 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69 43  lFirst && pc<=iC
c760: 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 73  ellLast );.    s
c770: 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43 65  ize = pPage->xCe
c780: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26 73  llSize(pPage, &s
c790: 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62 72  rc[pc]);.    cbr
c7a0: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69  k -= size;.    i
c7b0: 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72  f( cbrk<iCellFir
c7c0: 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73  st || pc+size>us
c7d0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
c7e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
c7f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
c800: 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ge);.    }.    a
c810: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
c820: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
c830: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
c840: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
c850: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
c860: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
c870: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
c880: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
c890: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
c8a0: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
c8b0: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
c8c0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
c8d0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
c8e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c8f0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
c900: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
c910: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
c920: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
c930: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
c940: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
c950: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
c960: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
c970: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
c980: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
c990: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
c9a0: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
c9b0: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 64 61   size);.  }.  da
c9c0: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 0a  ta[hdr+7] = 0;..
c9d0: 20 64 65 66 72 61 67 6d 65 6e 74 5f 6f 75 74 3a   defragment_out:
c9e0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
c9f0: 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
ca00: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 37 5d 2b  if( data[hdr+7]+
ca10: 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21  cbrk-iCellFirst!
ca20: 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  =pPage->nFree ){
ca30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ca40: 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
ca50: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  pPage);.  }.  as
ca60: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
ca70: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
ca80: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
ca90: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
caa0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
cab0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
cac0: 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69    memset(&data[i
cad0: 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63  CellFirst], 0, c
cae0: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b  brk-iCellFirst);
caf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
cb00: 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
cb10: 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
cb20: 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e) );.  return S
cb30: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cb40: 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 66 72  ** Search the fr
cb50: 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20  ee-list on page 
cb60: 70 50 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f  pPg for space to
cb70: 20 73 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42   store a cell nB
cb80: 79 74 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20  yte bytes in.** 
cb90: 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e  size. If one can
cba0: 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
cbb0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
cbc0: 68 65 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d  he space and rem
cbd0: 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74  ove it.** from t
cbe0: 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a  he free-list..**
cbf0: 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62  .** If no suitab
cc00: 6c 65 20 73 70 61 63 65 20 63 61 6e 20 62 65 20  le space can be 
cc10: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65  found on the fre
cc20: 65 2d 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e  e-list, return N
cc30: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ULL..**.** This 
cc40: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74  function may det
cc50: 65 63 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ect corruption w
cc60: 69 74 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63  ithin pPg.  If c
cc70: 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20  orruption is.** 
cc80: 64 65 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70  detected then *p
cc90: 52 63 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  Rc is set to SQL
cca0: 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
ccb0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
ccc0: 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e  ..**.** Slots on
ccd0: 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 74   the free list t
cce0: 68 61 74 20 61 72 65 20 62 65 74 77 65 65 6e 20  hat are between 
ccf0: 31 20 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61  1 and 3 bytes la
cd00: 72 67 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a  rger than nByte.
cd10: 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72  ** will be ignor
cd20: 65 64 20 69 66 20 61 64 64 69 6e 67 20 74 68 65  ed if adding the
cd30: 20 65 78 74 72 61 20 73 70 61 63 65 20 74 6f 20   extra space to 
cd40: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
cd50: 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65  n count.** cause
cd60: 73 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74  s the fragmentat
cd70: 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63  ion count to exc
cd80: 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69  eed 60..*/.stati
cd90: 63 20 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c  c u8 *pageFindSl
cda0: 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  ot(MemPage *pPg,
cdb0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20   int nByte, int 
cdc0: 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69  *pRc){.  const i
cdd0: 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
cde0: 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
cdf0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
ce00: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ce10: 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
ce20: 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 50 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  Page data */.  i
ce50: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
ce60: 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
ce70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ce80: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 70  ress of ptr to p
ce90: 63 20 2a 2f 0a 20 20 69 6e 74 20 70 63 20 3d 20  c */.  int pc = 
cea0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
ceb0: 69 41 64 64 72 5d 29 3b 20 20 20 20 20 20 20 20  iAddr]);        
cec0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
ced0: 61 20 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20  a free slot */. 
cee0: 20 69 6e 74 20 78 3b 20 20 20 20 20 20 20 20 20   int x;         
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
cf10: 78 63 65 73 73 20 73 69 7a 65 20 6f 66 20 74 68  xcess size of th
cf20: 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74 20  e slot */.  int 
cf30: 6d 61 78 50 43 20 3d 20 70 50 67 2d 3e 70 42 74  maxPC = pPg->pBt
cf40: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 6e  ->usableSize - n
cf50: 42 79 74 65 3b 20 20 2f 2a 20 4d 61 78 20 61 64  Byte;  /* Max ad
cf60: 64 72 65 73 73 20 66 6f 72 20 61 20 75 73 61 62  dress for a usab
cf70: 6c 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 69 6e 74  le slot */.  int
cf80: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cfb0: 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74  of the free slot
cfc0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
cfd0: 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  c>0 );.  while( 
cfe0: 70 63 3c 3d 6d 61 78 50 43 20 29 7b 0a 20 20 20  pc<=maxPC ){.   
cff0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
d000: 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38 20 54   R-22710-53328 T
d010: 68 65 20 74 68 69 72 64 20 61 6e 64 20 66 6f 75  he third and fou
d020: 72 74 68 20 62 79 74 65 73 20 6f 66 20 65 61 63  rth bytes of eac
d030: 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c 6f  h.    ** freeblo
d040: 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d 65 6e  ck form a big-en
d050: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
d060: 63 68 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ch is the size o
d070: 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 0a  f the freeblock.
d080: 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65 73 2c      ** in bytes,
d090: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 34   including the 4
d0a0: 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20 2a 2f  -byte header. */
d0b0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
d0c0: 62 79 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32  byte(&aData[pc+2
d0d0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78 20 3d  ]);.    if( (x =
d0e0: 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29 3e 3d   size - nByte)>=
d0f0: 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  0 ){.      testc
d100: 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20 20 20  ase( x==4 );.   
d110: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
d120: 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 78  3 );.      if( x
d130: 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <4 ){.        /*
d140: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
d150: 31 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61  11498-58022 In a
d160: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74   well-formed b-t
d170: 72 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f  ree page, the to
d180: 74 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  tal.        ** n
d190: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
d1a0: 6e 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20  n fragments may 
d1b0: 6e 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a  not exceed 60. *
d1c0: 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44  /.        if( aD
d1d0: 61 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20  ata[hdr+7]>57 ) 
d1e0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20  return 0;..     
d1f0: 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
d200: 20 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66   slot from the f
d210: 72 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65  ree-list. Update
d220: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
d230: 20 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65         ** fragme
d240: 6e 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69  nted bytes withi
d250: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
d260: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
d270: 44 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44  Data[iAddr], &aD
d280: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
d290: 20 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37       aData[hdr+7
d2a0: 5d 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20  ] += (u8)x;.    
d2b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 2b 70 63    }else if( x+pc
d2c0: 20 3e 20 6d 61 78 50 43 20 29 7b 0a 20 20 20 20   > maxPC ){.    
d2d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 73 6c 6f 74      /* This slot
d2e0: 20 65 78 74 65 6e 64 73 20 6f 66 66 20 74 68 65   extends off the
d2f0: 20 65 6e 64 20 6f 66 20 74 68 65 20 75 73 61 62   end of the usab
d300: 6c 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  le part of the p
d310: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a  age */.        *
d320: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52  pRc = SQLITE_COR
d330: 52 55 50 54 5f 50 41 47 45 28 70 50 67 29 3b 0a  RUPT_PAGE(pPg);.
d340: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
d350: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d360: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c         /* The sl
d370: 6f 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68  ot remains on th
d380: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64  e free-list. Red
d390: 75 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20  uce its size to 
d3a0: 61 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  account.        
d3b0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
d3c0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
d3d0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
d3e0: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
d3f0: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
d400: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
d410: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
d420: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
d430: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
d440: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
d450: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
d460: 20 20 20 69 66 28 20 70 63 3c 3d 69 41 64 64 72     if( pc<=iAddr
d470: 2b 73 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  +size ){.      i
d480: 66 28 20 70 63 20 29 7b 0a 20 20 20 20 20 20 20  f( pc ){.       
d490: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 73 6c 6f   /* The next slo
d4a0: 74 20 69 6e 20 74 68 65 20 63 68 61 69 6e 20 69  t in the chain i
d4b0: 73 20 6e 6f 74 20 70 61 73 74 20 74 68 65 20 65  s not past the e
d4c0: 6e 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  nd of the curren
d4d0: 74 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 20 20  t slot */.      
d4e0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
d4f0: 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67  CORRUPT_PAGE(pPg
d500: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
d520: 0a 20 20 7d 0a 20 20 69 66 28 20 70 63 3e 6d 61  .  }.  if( pc>ma
d530: 78 50 43 2b 6e 42 79 74 65 2d 34 20 29 7b 0a 20  xPC+nByte-4 ){. 
d540: 20 20 20 2f 2a 20 54 68 65 20 66 72 65 65 20 73     /* The free s
d550: 6c 6f 74 20 63 68 61 69 6e 20 65 78 74 65 6e 64  lot chain extend
d560: 73 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  s off the end of
d570: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
d580: 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43   *pRc = SQLITE_C
d590: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 67 29  ORRUPT_PAGE(pPg)
d5a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
d5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
d5c0: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
d5d0: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
d5e0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
d5f0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
d600: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
d610: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
d620: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
d630: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
d640: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
d650: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
d660: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
d670: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
d680: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
d690: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
d6a0: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
d6b0: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
d6c0: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
d6d0: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
d6e0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
d6f0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
d700: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
d710: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
d720: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
d730: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
d740: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
d750: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
d760: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
d770: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
d780: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
d790: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
d7a0: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
d7b0: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
d7c0: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
d7d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
d7e0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
d7f0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
d800: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
d810: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
d820: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
d830: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
d840: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
d850: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
d860: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
d870: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
d880: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
d890: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
d8a0: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
d8b0: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
d8c0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
d8d0: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
d8e0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
d8f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
d900: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
d910: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
d920: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d940: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
d950: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
d960: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
d970: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d990: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
d9a0: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
d9b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
d9c0: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
d9d0: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
d9e0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
d9f0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
da00: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
da10: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
da20: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
da30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
da40: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
da50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
da60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
da70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
da80: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
da90: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
daa0: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
dab0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dac0: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
dad0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
dae0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
daf0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
db00: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
db10: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
db20: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
db30: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
db40: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
db50: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
db60: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
db70: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
db80: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
db90: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
dba0: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
dbb0: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
dbc0: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
dbd0: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
dbe0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
dbf0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
dc00: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
dc10: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
dc20: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
dc30: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
dc40: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
dc50: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
dc60: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
dc70: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
dc80: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
dc90: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
dca0: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
dcb0: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
dcc0: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
dcd0: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
dce0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
dcf0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
dd00: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
dd10: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
dd20: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
dd30: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
dd40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
dd50: 2a 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74  * by btreeComput
dd60: 65 46 72 65 65 53 70 61 63 65 28 29 20 2a 2f 0a  eFreeSpace() */.
dd70: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
dd80: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
dd90: 26 26 20 41 4c 57 41 59 53 28 70 50 61 67 65 2d  && ALWAYS(pPage-
dda0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
ddb0: 3d 3d 36 35 35 33 36 29 20 29 7b 0a 20 20 20 20  ==65536) ){.    
ddc0: 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20    top = 65536;. 
ddd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dde0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ddf0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
de00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
de10: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 65  /* If there is e
de20: 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74 77  nough space betw
de30: 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70 20  een gap and top 
de40: 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65 6c  for one more cel
de50: 6c 20 70 6f 69 6e 74 65 72 2c 0a 20 20 2a 2a 20  l pointer,.  ** 
de60: 61 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c  and if the freel
de70: 69 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79  ist is not empty
de80: 2c 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68  , then search th
de90: 65 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20  e.  ** freelist 
dea0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
deb0: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
dec0: 20 73 61 74 69 73 66 79 20 74 68 65 20 72 65 71   satisfy the req
ded0: 75 65 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73  uest..  */.  tes
dee0: 74 63 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f  tcase( gap+2==to
def0: 70 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  p );.  testcase(
df00: 20 67 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20   gap+1==top );. 
df10: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d   testcase( gap==
df20: 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61  top );.  if( (da
df30: 74 61 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74  ta[hdr+2] || dat
df40: 61 5b 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70  a[hdr+1]) && gap
df50: 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75  +2<=top ){.    u
df60: 38 20 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65  8 *pSpace = page
df70: 46 69 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20  FindSlot(pPage, 
df80: 6e 42 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20  nByte, &rc);.   
df90: 20 69 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20   if( pSpace ){. 
dfa0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 70       assert( pSp
dfb0: 61 63 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53  ace>=data && (pS
dfc0: 70 61 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35  pace - data)<655
dfd0: 33 36 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64  36 );.      *pId
dfe0: 78 20 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65  x = (int)(pSpace
dff0: 20 2d 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20   - data);.      
e000: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e010: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
e020: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
e030: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
e040: 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65  ..  /* The reque
e050: 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  st could not be 
e060: 66 75 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20  fulfilled using 
e070: 61 20 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e  a freelist slot.
e080: 20 20 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20    Check.  ** to 
e090: 73 65 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e  see if defragmen
e0a0: 74 61 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73  tation is necess
e0b0: 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74  ary..  */.  test
e0c0: 63 61 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74  case( gap+2+nByt
e0d0: 65 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20  e==top );.  if( 
e0e0: 67 61 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20  gap+2+nByte>top 
e0f0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e100: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  Page->nCell>0 ||
e110: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
e120: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e130: 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20  ->nFree>=0 );.  
e140: 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
e150: 74 50 61 67 65 28 70 50 61 67 65 2c 20 4d 49 4e  tPage(pPage, MIN
e160: 28 34 2c 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  (4, pPage->nFree
e170: 20 2d 20 28 32 2b 6e 42 79 74 65 29 29 29 3b 0a   - (2+nByte)));.
e180: 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
e190: 75 72 6e 20 72 63 3b 0a 20 20 20 20 74 6f 70 20  urn rc;.    top 
e1a0: 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65 72  = get2byteNotZer
e1b0: 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  o(&data[hdr+5]);
e1c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 61 70  .    assert( gap
e1d0: 2b 32 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29 3b  +2+nByte<=top );
e1e0: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  .  }...  /* Allo
e1f0: 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  cate memory from
e200: 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77   the gap in betw
e210: 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  een the cell poi
e220: 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20  nter array.  ** 
e230: 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  and the cell con
e240: 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65 20  tent area.  The 
e250: 62 74 72 65 65 43 6f 6d 70 75 74 65 46 72 65 65  btreeComputeFree
e260: 53 70 61 63 65 28 29 20 63 61 6c 6c 20 68 61 73  Space() call has
e270: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61   already.  ** va
e280: 6c 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65  lidated the free
e290: 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61  list.  Given tha
e2a0: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  t the freelist i
e2b0: 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20  s valid, there. 
e2c0: 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68   ** is no way th
e2d0: 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  at the allocatio
e2e0: 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66  n can extend off
e2f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
e300: 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61  page..  ** The a
e310: 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65  ssert() below ve
e320: 72 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69  rifies the previ
e330: 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20  ous sentence..  
e340: 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74  */.  top -= nByt
e350: 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  e;.  put2byte(&d
e360: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29  ata[hdr+5], top)
e370: 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b  ;.  assert( top+
e380: 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50  nByte <= (int)pP
e390: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
e3a0: 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20  Size );.  *pIdx 
e3b0: 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = top;.  return 
e3c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e3d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
e3e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
e3f0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
e400: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
e410: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
e420: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
e430: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74  k is pPage->aDat
e440: 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64  a[iStart].** and
e450: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
e460: 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20   block is iSize 
e470: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a  bytes..**.** Adj
e480: 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73  acent freeblocks
e490: 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a   are coalesced..
e4a0: 2a 2a 0a 2a 2a 20 45 76 65 6e 20 74 68 6f 75 67  **.** Even thoug
e4b0: 68 20 74 68 65 20 66 72 65 65 62 6c 6f 63 6b 20  h the freeblock 
e4c0: 6c 69 73 74 20 77 61 73 20 63 68 65 63 6b 65 64  list was checked
e4d0: 20 62 79 20 62 74 72 65 65 43 6f 6d 70 75 74 65   by btreeCompute
e4e0: 46 72 65 65 53 70 61 63 65 28 29 2c 0a 2a 2a 20  FreeSpace(),.** 
e4f0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
e500: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
e510: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
e520: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
e530: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
e540: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
e550: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
e560: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
e570: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
e580: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
e590: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
e5a0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
e5b0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
e5c0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
e5d0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
e5e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e5f0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
e600: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
e610: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
e620: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
e630: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
e640: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
e650: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e670: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
e680: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
e690: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
e6a0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
e6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e6d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
e6e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
e6f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
e720: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
e730: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
e740: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
e760: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
e770: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
e780: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
e790: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
e7a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
e7b0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
e7c0: 2f 0a 20 20 75 31 36 20 78 3b 20 20 20 20 20 20  /.  u16 x;      
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
e7f0: 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
e800: 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 33  ent area */.  u3
e810: 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74 20  2 iEnd = iStart 
e820: 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  + iSize;        
e830: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
e840: 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61 72  e past the iStar
e850: 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75 6e  t buffer */.  un
e860: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e870: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
e880: 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74  ;   /* Page cont
e890: 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ent */..  assert
e8a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e8b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
e8c0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
e8d0: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
e8e0: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
e8f0: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
e900: 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e 68  iStart>=pPage->h
e910: 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67 65  drOffset+6+pPage
e920: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 29  ->childPtrSize )
e930: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
e940: 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20 3c  UPT_DB || iEnd <
e950: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
e960: 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61 73  ableSize );.  as
e970: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
e980: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
e990: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
e9a0: 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e 3d   assert( iSize>=
e9b0: 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75  4 );   /* Minimu
e9c0: 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34  m cell size is 4
e9d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
e9e0: 74 61 72 74 3c 3d 70 50 61 67 65 2d 3e 70 42 74  tart<=pPage->pBt
e9f0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
ea00: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  ;..  /* The list
ea10: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d   of freeblocks m
ea20: 75 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64  ust be in ascend
ea30: 69 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64  ing order.  Find
ea40: 20 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20   the .  ** spot 
ea50: 6f 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72  on the list wher
ea60: 65 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20  e iStart should 
ea70: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a  be inserted..  *
ea80: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
ea90: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50  >hdrOffset;.  iP
eaa0: 74 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  tr = hdr + 1;.  
eab0: 69 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d  if( data[iPtr+1]
eac0: 3d 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72  ==0 && data[iPtr
ead0: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65  ]==0 ){.    iFre
eae0: 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68  eBlk = 0;  /* Sh
eaf0: 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
eb00: 61 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65  ase when the fre
eb10: 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a  elist is empty *
eb20: 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  /.  }else{.    w
eb30: 68 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20  hile( (iFreeBlk 
eb40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
eb50: 5b 69 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20  [iPtr]))<iStart 
eb60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46 72  ){.      if( iFr
eb70: 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a  eeBlk<iPtr+4 ){.
eb80: 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 65          if( iFre
eb90: 65 42 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eBlk==0 ) break;
eba0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
ebb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
ebc0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
ebd0: 20 20 7d 0a 20 20 20 20 20 20 69 50 74 72 20 3d    }.      iPtr =
ebe0: 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d   iFreeBlk;.    }
ebf0: 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c  .    if( iFreeBl
ec00: 6b 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  k>pPage->pBt->us
ec10: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
ec20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ec30: 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
ec40: 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
ec50: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
ec60: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
ec70: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
ec80: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
ec90: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
eca0: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
ecb0: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
ecc0: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
ecd0: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
ece0: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
ecf0: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
ed00: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
ed10: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
ed20: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
ed30: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
ed40: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
ed50: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
ed60: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
ed70: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
ed80: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
ed90: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
eda0: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
edb0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
edc0: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
edd0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
ede0: 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
edf0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
ee00: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
ee10: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
ee20: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
ee30: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
ee40: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
ee50: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
ee60: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
ee70: 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
ee80: 7d 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20  }.      iSize = 
ee90: 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20  iEnd - iStart;. 
eea0: 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20       iFreeBlk = 
eeb0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
eec0: 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d  FreeBlk]);.    }
eed0: 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50  .  .    /* If iP
eee0: 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72  tr is another fr
eef0: 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73  eeblock (that is
ef00: 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74  , if iPtr is not
ef10: 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20   the freelist.  
ef20: 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20    ** pointer in 
ef30: 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72 29  the page header)
ef40: 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73   then check to s
ef50: 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68 6f  ee if iStart sho
ef60: 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f  uld be.    ** co
ef70: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
ef80: 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20   end of iPtr..  
ef90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74    */.    if( iPt
efa0: 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20  r>hdr+1 ){.     
efb0: 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69   int iPtrEnd = i
efc0: 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28 26  Ptr + get2byte(&
efd0: 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20  data[iPtr+2]);. 
efe0: 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64       if( iPtrEnd
eff0: 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20  +3>=iStart ){.  
f000: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
f010: 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75 72  d>iStart ) retur
f020: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f030: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
f040: 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20 69        nFrag += i
f050: 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64 3b  Start - iPtrEnd;
f060: 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d  .        iSize =
f070: 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20 20   iEnd - iPtr;.  
f080: 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69        iStart = i
f090: 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Ptr;.      }.   
f0a0: 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61 67   }.    if( nFrag
f0b0: 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20 72  >data[hdr+7] ) r
f0c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f0d0: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
f0e0: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
f0f0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
f100: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
f110: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
f120: 69 66 28 20 69 53 74 61 72 74 3c 3d 78 20 29 7b  if( iStart<=x ){
f130: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
f140: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74 20  freeblock is at 
f150: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f160: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
f170: 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20 73  t area,.    ** s
f180: 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74 68  o just extend th
f190: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f1a0: 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e 20  rea rather than 
f1b0: 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a 20  create another. 
f1c0: 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 65     ** freelist e
f1d0: 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  ntry */.    if( 
f1e0: 69 53 74 61 72 74 3c 78 20 7c 7c 20 69 50 74 72  iStart<x || iPtr
f1f0: 21 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e  !=hdr+1 ) return
f200: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f210: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
f220: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f230: 68 64 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b  hdr+1], iFreeBlk
f240: 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
f250: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45  &data[hdr+5], iE
f260: 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nd);.  }else{.  
f270: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
f280: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e  new freeblock in
f290: 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
f2a0: 2a 2f 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  */.    put2byte(
f2b0: 26 64 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74  &data[iPtr], iSt
f2c0: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  art);.  }.  if( 
f2d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
f2e0: 6c 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f  lags & BTS_FAST_
f2f0: 53 45 43 55 52 45 20 29 7b 0a 20 20 20 20 2f 2a  SECURE ){.    /*
f300: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
f310: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
f320: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
f330: 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65  he secure_delete
f340: 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69  .    ** option i
f350: 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 20  s enabled */.   
f360: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53   memset(&data[iS
f370: 74 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29  tart], 0, iSize)
f380: 3b 0a 20 20 7d 0a 20 20 70 75 74 32 62 79 74 65  ;.  }.  put2byte
f390: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
f3a0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 70 75 74  iFreeBlk);.  put
f3b0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
f3c0: 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b 0a 20  rt+2], iSize);. 
f3d0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
f3e0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
f3f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
f400: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
f410: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
f420: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
f430: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
f440: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
f450: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
f460: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
f470: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
f480: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
f490: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
f4a0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
f4b0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
f4c0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
f4d0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
f4e0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
f4f0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
f500: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
f510: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
f520: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
f530: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
f540: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
f550: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
f560: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
f570: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
f580: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
f590: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
f5a0: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
f5b0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
f5c0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
f5d0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
f5e0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
f5f0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
f600: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
f610: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
f620: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
f630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f640: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
f650: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
f660: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
f670: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
f680: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
f690: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
f6a0: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
f6b0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
f6c0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
f6d0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
f6e0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
f6f0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
f700: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
f710: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
f720: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
f730: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
f740: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
f750: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
f760: 37 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c  7291-35328 A val
f770: 75 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d  ue of 5 (0x05) m
f780: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
f790: 20 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72   an.    ** inter
f7a0: 69 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65  ior table b-tree
f7b0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
f7c0: 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44  sert( (PTF_LEAFD
f7d0: 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d  ATA|PTF_INTKEY)=
f7e0: 3d 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  =5 );.    /* EVI
f7f0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30  DENCE-OF: R-2690
f800: 30 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20  0-09176 A value 
f810: 6f 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61  of 13 (0x0d) mea
f820: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
f830: 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62  .    ** leaf tab
f840: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
f850: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
f860: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
f870: 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46  _INTKEY|PTF_LEAF
f880: 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61  )==13 );.    pPa
f890: 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a  ge->intKey = 1;.
f8a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
f8b0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61  eaf ){.      pPa
f8c0: 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d  ge->intKeyLeaf =
f8d0: 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   1;.      pPage-
f8e0: 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74  >xParseCell = bt
f8f0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b  reeParseCellPtr;
f900: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f910: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c    pPage->intKeyL
f920: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  eaf = 0;.      p
f930: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
f940: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
f950: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
f960: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f970: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f980: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
f990: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
f9a0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
f9b0: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
f9c0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
f9d0: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
f9e0: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
f9f0: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
fa00: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
fa10: 45 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37  E-OF: R-43316-37
fa20: 33 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32  308 A value of 2
fa30: 20 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68   (0x02) means th
fa40: 65 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20  e page is an.   
fa50: 20 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64   ** interior ind
fa60: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
fa70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
fa80: 50 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32  PTF_ZERODATA)==2
fa90: 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   );.    /* EVIDE
faa0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d  NCE-OF: R-59615-
fab0: 34 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66  42828 A value of
fac0: 20 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73   10 (0x0a) means
fad0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20   the page is a. 
fae0: 20 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78     ** leaf index
faf0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
fb00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
fb10: 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c  F_ZERODATA|PTF_L
fb20: 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20  EAF)==10 );.    
fb30: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
fb40: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  0;.    pPage->in
fb50: 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
fb60: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
fb70: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
fb80: 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20  CellPtrIndex;.  
fb90: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
fba0: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
fbb0: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
fbc0: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
fbd0: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
fbe0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
fbf0: 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34  -OF: R-47608-564
fc00: 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c  69 Any other val
fc10: 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65  ue for the b-tre
fc20: 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20  e page type is. 
fc30: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20     ** an error. 
fc40: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
fc50: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
fc60: 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  E(pPage);.  }.  
fc70: 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50  pPage->max1byteP
fc80: 61 79 6c 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61  ayload = pBt->ma
fc90: 78 31 62 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20  x1bytePayload;. 
fca0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fcb0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  K;.}../*.** Comp
fcc0: 75 74 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ute the amount o
fcd0: 66 20 66 72 65 65 73 70 61 63 65 20 6f 6e 20 74  f freespace on t
fce0: 68 65 20 70 61 67 65 2e 20 20 49 6e 20 6f 74 68  he page.  In oth
fcf0: 65 72 20 77 6f 72 64 73 2c 20 66 69 6c 6c 0a 2a  er words, fill.*
fd00: 2a 20 69 6e 20 74 68 65 20 70 50 61 67 65 2d 3e  * in the pPage->
fd10: 6e 46 72 65 65 20 66 69 65 6c 64 2e 0a 2a 2f 0a  nFree field..*/.
fd20: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
fd30: 43 6f 6d 70 75 74 65 46 72 65 65 53 70 61 63 65  ComputeFreeSpace
fd40: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
fd50: 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  {.  int pc;     
fd60: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
fd70: 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b  s of a freeblock
fd80: 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61   within pPage->a
fd90: 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68  Data[] */.  u8 h
fda0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
fdb0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
fdc0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
fdd0: 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ader */.  u8 *da
fde0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
fdf0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
fe00: 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 75  aData */.  int u
fe10: 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a  sableSize;    /*
fe20: 20 41 6d 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c   Amount of usabl
fe30: 65 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  e space on each 
fe40: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  page */.  int nF
fe50: 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ree;         /* 
fe60: 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64  Number of unused
fe70: 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70 61   bytes on the pa
fe80: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70 3b  ge */.  int top;
fe90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
fea0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
feb0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
fec0: 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c  a */.  int iCell
fed0: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
fee0: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
fef0: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
ff00: 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ffset */.  int i
ff10: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a  CellLast;     /*
ff20: 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63   Last possible c
ff30: 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  ell or freeblock
ff40: 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61 73   offset */..  as
ff50: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
ff60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
ff70: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21   pPage->pBt->db!
ff80: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
ff90: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ffa0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
ffb0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
ffc0: 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  t( pPage->pgno==
ffd0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
ffe0: 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
fff0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
10000 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c  rt( pPage == sql
10010 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
10020 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
10030 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
10040 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73  Page->aData == s
10050 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
10060 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
10070 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
10080 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 31  pPage->isInit==1
10090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
100a0 61 67 65 2d 3e 6e 46 72 65 65 3c 30 20 29 3b 0a  age->nFree<0 );.
100b0 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
100c0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
100d0 6c 65 53 69 7a 65 3b 0a 20 20 68 64 72 20 3d 20  leSize;.  hdr = 
100e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
100f0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
10100 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20 45 56  ->aData;.  /* EV
10110 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30  IDENCE-OF: R-580
10120 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f  15-48175 The two
10130 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
10140 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67 6e   offset 5 design
10150 61 74 65 73 0a 20 20 2a 2a 20 74 68 65 20 73 74  ates.  ** the st
10160 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  art of the cell 
10170 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20  content area. A 
10180 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74  zero value for t
10190 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20  his integer is. 
101a0 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
101b0 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 74  as 65536. */.  t
101c0 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
101d0 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
101e0 5d 29 3b 0a 20 20 69 43 65 6c 6c 46 69 72 73 74  ]);.  iCellFirst
101f0 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61   = hdr + 8 + pPa
10200 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
10210 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10220 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
10230 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10240 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
10250 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
10260 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a  ace on the page.
10270 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
10280 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20  : R-23588-34450 
10290 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
102a0 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31  eger at offset 1
102b0 20 67 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20   gives the.  ** 
102c0 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69 72  start of the fir
102d0 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20  st freeblock on 
102e0 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20  the page, or is 
102f0 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61 72  zero if there ar
10300 65 20 6e 6f 0a 20 20 2a 2a 20 66 72 65 65 62 6c  e no.  ** freebl
10310 6f 63 6b 73 2e 20 2a 2f 0a 20 20 70 63 20 3d 20  ocks. */.  pc = 
10320 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
10330 64 72 2b 31 5d 29 3b 0a 20 20 6e 46 72 65 65 20  dr+1]);.  nFree 
10340 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 2b 20  = data[hdr+7] + 
10350 74 6f 70 3b 20 20 2f 2a 20 49 6e 69 74 20 6e 46  top;  /* Init nF
10360 72 65 65 20 74 6f 20 6e 6f 6e 2d 66 72 65 65 62  ree to non-freeb
10370 6c 6f 63 6b 20 66 72 65 65 20 73 70 61 63 65 20  lock free space 
10380 2a 2f 0a 20 20 69 66 28 20 70 63 3e 30 20 29 7b  */.  if( pc>0 ){
10390 0a 20 20 20 20 75 33 32 20 6e 65 78 74 2c 20 73  .    u32 next, s
103a0 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  ize;.    if( pc<
103b0 69 43 65 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20  iCellFirst ){.  
103c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
103d0 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33  OF: R-55530-5293
103e0 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  0 In a well-form
103f0 65 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20  ed b-tree page, 
10400 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20  there will.     
10410 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61 74   ** always be at
10420 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c 20   least one cell 
10430 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
10440 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20 20   freeblock..    
10450 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
10460 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
10470 5f 50 41 47 45 28 70 50 61 67 65 29 3b 20 0a 20  _PAGE(pPage); . 
10480 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
10490 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  1 ){.      if( p
104a0 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
104b0 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c         /* Freebl
104c0 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ock off the end 
104d0 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
104e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
104f0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10500 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10510 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67  }.      next = g
10520 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
10530 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d  ]);.      size =
10540 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
10550 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 6e 46  pc+2]);.      nF
10560 72 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69  ree = nFree + si
10570 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ze;.      if( ne
10580 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 20  xt<=pc+size+3 ) 
10590 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 63 20  break;.      pc 
105a0 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
105b0 20 20 69 66 28 20 6e 65 78 74 3e 30 20 29 7b 0a    if( next>0 ){.
105c0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 62 6c 6f        /* Freeblo
105d0 63 6b 20 6e 6f 74 20 69 6e 20 61 73 63 65 6e 64  ck not in ascend
105e0 69 6e 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ing order */.   
105f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10600 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
10610 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  age);.    }.    
10620 69 66 28 20 70 63 2b 73 69 7a 65 3e 28 75 6e 73  if( pc+size>(uns
10630 69 67 6e 65 64 20 69 6e 74 29 75 73 61 62 6c 65  igned int)usable
10640 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
10650 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63 6b 20   Last freeblock 
10660 65 78 74 65 6e 64 73 20 70 61 73 74 20 70 61 67  extends past pag
10670 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20 20 72  e end */.      r
10680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
10690 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
106a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
106b0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
106c0 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
106d0 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
106e0 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
106f0 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 63  rt.  ** of the c
10700 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10710 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72   plus the number
10720 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77   of free bytes w
10730 69 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 63  ithin.  ** the c
10740 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
10750 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
10760 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
10770 61 62 6c 65 2d 73 69 7a 65 0a 20 20 2a 2a 20 6f  able-size.  ** o
10780 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  f the page, then
10790 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 62   the page must b
107a0 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  e corrupted. Thi
107b0 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 2a  s check also.  *
107c0 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
107d0 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
107e0 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
107f0 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
10800 65 6e 74 0a 20 20 2a 2a 20 61 72 65 61 2c 20 61  ent.  ** area, a
10810 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
10820 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c 69 65  page header, lie
10830 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67  s within the pag
10840 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46  e..  */.  if( nF
10850 72 65 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 7c  ree>usableSize |
10860 7c 20 6e 46 72 65 65 3c 69 43 65 6c 6c 46 69 72  | nFree<iCellFir
10870 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
10880 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10890 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
108a0 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
108b0 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20 2d 20  = (u16)(nFree - 
108c0 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 72  iCellFirst);.  r
108d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
108e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 64 64  .}../*.** Do add
108f0 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 20 63  itional sanity c
10900 68 65 63 6b 20 61 66 74 65 72 20 62 74 72 65 65  heck after btree
10910 49 6e 69 74 50 61 67 65 28 29 20 69 66 0a 2a 2a  InitPage() if.**
10920 20 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a   PRAGMA cell_siz
10930 65 5f 63 68 65 63 6b 3d 4f 4e 20 0a 2a 2f 0a 73  e_check=ON .*/.s
10940 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
10950 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 43  NLINE int btreeC
10960 65 6c 6c 53 69 7a 65 43 68 65 63 6b 28 4d 65 6d  ellSizeCheck(Mem
10970 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
10980 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20  int iCellFirst; 
10990 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
109a0 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72  wable cell or fr
109b0 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
109c0 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61 73  /.  int iCellLas
109d0 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70  t;     /* Last p
109e0 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72 20  ossible cell or 
109f0 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
10a00 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
10a10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10a20 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
10a30 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
10a40 0a 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20  .  int sz;      
10a50 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
10a60 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74   a cell */.  int
10a70 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
10a80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
10a90 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
10aa0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
10ab0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
10ac0 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c          /* Equal
10ad0 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61   to pPage->aData
10ae0 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
10af0 53 69 7a 65 3b 20 20 20 20 2f 2a 20 4d 61 78 69  Size;    /* Maxi
10b00 6d 75 6d 20 75 73 61 62 6c 65 20 73 70 61 63 65  mum usable space
10b10 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
10b20 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
10b30 3b 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f 66  ;    /* Start of
10b40 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
10b50 65 61 20 2a 2f 0a 0a 20 20 69 43 65 6c 6c 46 69  ea */..  iCellFi
10b60 72 73 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  rst = pPage->cel
10b70 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61 67  lOffset + 2*pPag
10b80 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 75 73 61 62  e->nCell;.  usab
10b90 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
10ba0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
10bb0 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
10bc0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
10bd0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
10be0 44 61 74 61 3b 0a 20 20 63 65 6c 6c 4f 66 66 73  Data;.  cellOffs
10bf0 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  et = pPage->cell
10c00 4f 66 66 73 65 74 3b 0a 20 20 69 66 28 20 21 70  Offset;.  if( !p
10c10 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65  Page->leaf ) iCe
10c20 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 66 6f 72 28  llLast--;.  for(
10c30 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
10c40 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
10c50 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
10c60 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
10c70 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
10c80 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
10c90 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
10ca0 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43  testcase( pc==iC
10cb0 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 69  ellLast );.    i
10cc0 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10cd0 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74   || pc>iCellLast
10ce0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10cf0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10d00 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
10d10 20 7d 0a 20 20 20 20 73 7a 20 3d 20 70 50 61 67   }.    sz = pPag
10d20 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
10d30 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
10d40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
10d50 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
10d60 29 3b 0a 20 20 20 20 69 66 28 20 70 63 2b 73 7a  );.    if( pc+sz
10d70 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
10d80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10d90 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10da0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
10db0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10dc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
10dd0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75  nitialize the au
10de0 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74  xiliary informat
10df0 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62  ion for a disk b
10e00 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lock..**.** Retu
10e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10e20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20  success.  If we 
10e30 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  see that the pag
10e40 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f  e does.** not co
10e50 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72  ntain a well-for
10e60 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67  med database pag
10e70 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a  e, then return .
10e80 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ** SQLITE_CORRUP
10e90 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20  T.  Note that a 
10ea0 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45  return of SQLITE
10eb0 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  _OK does not.** 
10ec0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
10ed0 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d  he page is well-
10ee0 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79  formed.  It only
10ef0 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77   shows that.** w
10f00 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65  e failed to dete
10f10 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f  ct any corruptio
10f20 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
10f30 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 4d   btreeInitPage(M
10f40 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
10f50 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
10f60 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20 74 6f       /* Equal to
10f70 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f   pPage->aData */
10f80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10f90 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
10fa0 6d 61 69 6e 20 62 74 72 65 65 20 73 74 72 75 63  main btree struc
10fb0 74 75 72 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ture */..  asser
10fc0 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
10fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
10fe0 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20  age->pBt->db!=0 
10ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11000 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11010 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
11020 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
11030 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
11040 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
11050 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
11060 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
11070 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
11080 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
11090 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
110a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
110b0 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
110c0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
110d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
110e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
110f0 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b  ge->isInit==0 );
11100 0a 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ..  pBt = pPage-
11110 3e 70 42 74 3b 0a 20 20 64 61 74 61 20 3d 20 70  >pBt;.  data = p
11120 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 50  Page->aData + pP
11130 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
11140 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11150 3a 20 52 2d 32 38 35 39 34 2d 30 32 38 39 30 20  : R-28594-02890 
11160 54 68 65 20 6f 6e 65 2d 62 79 74 65 20 66 6c 61  The one-byte fla
11170 67 20 61 74 20 6f 66 66 73 65 74 20 30 20 69 6e  g at offset 0 in
11180 64 69 63 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68  dicating.  ** th
11190 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 74 79  e b-tree page ty
111a0 70 65 2e 20 2a 2f 0a 20 20 69 66 28 20 64 65 63  pe. */.  if( dec
111b0 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
111c0 64 61 74 61 5b 30 5d 29 20 29 7b 0a 20 20 20 20  data[0]) ){.    
111d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
111e0 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
111f0 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
11200 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
11210 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
11220 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
11230 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
11240 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
11250 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
11260 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
11270 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65  = 0;.  pPage->ce
11280 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
11290 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38 20  ->hdrOffset + 8 
112a0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
112b0 72 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e  rSize;.  pPage->
112c0 61 43 65 6c 6c 49 64 78 20 3d 20 64 61 74 61 20  aCellIdx = data 
112d0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
112e0 72 53 69 7a 65 20 2b 20 38 3b 0a 20 20 70 50 61  rSize + 8;.  pPa
112f0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 70  ge->aDataEnd = p
11300 50 61 67 65 2d 3e 61 44 61 74 61 20 2b 20 70 42  Page->aData + pB
11310 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
11320 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
11330 74 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  t = pPage->aData
11340 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
11350 74 72 53 69 7a 65 3b 0a 20 20 2f 2a 20 45 56 49  trSize;.  /* EVI
11360 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
11370 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
11380 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
11390 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
113a0 68 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  he.  ** number o
113b0 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
113c0 61 67 65 2e 20 2a 2f 0a 20 20 70 50 61 67 65 2d  age. */.  pPage-
113d0 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
113e0 65 28 26 64 61 74 61 5b 33 5d 29 3b 0a 20 20 69  e(&data[3]);.  i
113f0 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  f( pPage->nCell>
11400 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a  MX_CELL(pBt) ){.
11410 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63      /* To many c
11420 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  ells for a singl
11430 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  e page.  The pag
11440 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
11450 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
11460 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11470 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a  AGE(pPage);.  }.
11480 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
11490 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
114a0 4c 28 70 42 74 29 20 29 3b 0a 20 20 2f 2a 20 45  L(pBt) );.  /* E
114b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34  VIDENCE-OF: R-24
114c0 30 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70  089-57979 If a p
114d0 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  age contains no 
114e0 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20  cells (which is 
114f0 6f 6e 6c 79 0a 20 20 2a 2a 20 70 6f 73 73 69 62  only.  ** possib
11500 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61  le for a root pa
11510 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68  ge of a table th
11520 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  at contains no r
11530 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20  ows) then the.  
11540 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  ** offset to the
11550 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
11560 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68  ea will equal th
11570 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75  e page size minu
11580 73 20 74 68 65 0a 20 20 2a 2a 20 62 79 74 65 73  s the.  ** bytes
11590 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
115a0 63 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ce. */.  assert(
115b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 0a   pPage->nCell>0.
115c0 20 20 20 20 20 20 20 7c 7c 20 67 65 74 32 62 79         || get2by
115d0 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
115e0 35 5d 29 3d 3d 28 69 6e 74 29 70 42 74 2d 3e 75  5])==(int)pBt->u
115f0 73 61 62 6c 65 53 69 7a 65 0a 20 20 20 20 20 20  sableSize.      
11600 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
11610 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
11620 20 3d 20 2d 31 3b 20 20 2f 2a 20 49 6e 64 69 63   = -1;  /* Indic
11630 61 74 65 20 74 68 61 74 20 74 68 69 73 20 76 61  ate that this va
11640 6c 75 65 20 69 73 20 79 65 74 20 75 6e 63 6f 6d  lue is yet uncom
11650 70 75 74 65 64 20 2a 2f 0a 20 20 70 50 61 67 65  puted */.  pPage
11660 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
11670 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61  if( pBt->db->fla
11680 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c  gs & SQLITE_Cell
11690 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 72 65  SizeCk ){.    re
116a0 74 75 72 6e 20 62 74 72 65 65 43 65 6c 6c 53 69  turn btreeCellSi
116b0 7a 65 43 68 65 63 6b 28 70 50 61 67 65 29 3b 0a  zeCheck(pPage);.
116c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
116d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
116e0 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
116f0 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
11700 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
11710 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
11720 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
11730 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
11740 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
11750 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
11760 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
11770 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
11780 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
11790 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
117a0 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
117b0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
117c0 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
117d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
117e0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
117f0 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
11800 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
11810 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11820 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11830 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11840 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11850 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11860 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11870 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11880 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
11890 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
118a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
118b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
118c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
118d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
118e0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
118f0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
11900 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
11910 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ECURE ){.    mem
11920 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
11930 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
11940 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
11950 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
11960 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
11970 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
11980 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
11990 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
119a0 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
119b0 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
119c0 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
119d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
119e0 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
119f0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
11a00 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
11a10 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
11a20 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
11a30 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
11a40 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
11a50 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
11a60 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
11a70 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
11a80 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
11a90 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
11aa0 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
11ab0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
11ac0 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
11ad0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
11ae0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
11af0 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
11b00 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
11b10 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
11b20 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
11b30 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
11b40 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
11b50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
11b60 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
11b70 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
11b80 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
11b90 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
11ba0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
11bb0 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
11bc0 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
11bd0 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
11be0 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
11bf0 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
11c00 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
11c10 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
11c20 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
11c30 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
11c40 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
11c50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
11c60 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11c70 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
11c80 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
11c90 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
11ca0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11cb0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
11cc0 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
11cd0 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
11ce0 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
11cf0 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
11d00 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
11d10 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
11d20 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
11d30 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
11d40 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11d50 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
11d60 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
11d70 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11d80 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
11d90 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11da0 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
11db0 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
11dc0 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
11dd0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
11de0 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
11df0 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
11e00 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
11e10 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
11e20 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
11e30 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
11e40 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
11e50 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
11e60 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11e70 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
11e80 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
11e90 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
11ea0 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
11eb0 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
11ec0 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
11ed0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
11ee0 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
11ef0 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
11f00 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
11f10 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
11f20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
11f30 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
11f40 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
11f50 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
11f60 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
11f70 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
11f80 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
11f90 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11fa0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
11fb0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
11fc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
11fd0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
11fe0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
11ff0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
12000 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
12010 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
12020 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
12030 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
12040 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
12050 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
12060 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
12070 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
12080 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
12090 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
120a0 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
120b0 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
120c0 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
120d0 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
120e0 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
120f0 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
12100 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
12110 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12120 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
12130 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
12140 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
12150 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
12160 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
12170 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
12180 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
12190 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
121a0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
121b0 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
121c0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
121d0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
121e0 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
121f0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
12200 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
12210 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
12220 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
12230 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
12240 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
12250 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
12260 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
12270 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
12280 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
12290 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
122a0 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
122b0 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
122c0 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
122d0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
122e0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
122f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12300 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
12310 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
12320 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
12330 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
12340 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
12350 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
12360 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
12370 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
12380 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
12390 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
123a0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
123b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
123c0 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
123d0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
123e0 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
123f0 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
12400 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
12410 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
12420 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
12430 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
12440 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
12450 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
12460 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
12470 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
12480 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
12490 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
124a0 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
124b0 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
124c0 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
124d0 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  rn btreePagecoun
124e0 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a  t(p->pBt);.}../*
124f0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
12500 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
12510 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
12520 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d  .**.** If pCur!=
12530 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  0 then the page 
12540 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64  is being fetched
12550 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f   as part of a mo
12560 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63  veToChild().** c
12570 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f  all.  Do additio
12580 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
12590 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
125a0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
125b0 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63   And if the fetc
125c0 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f  h fails, this ro
125d0 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65  utine must decre
125e0 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65  ment pCur->iPage
125f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
12600 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72   is fetched as r
12610 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73  ead-write unless
12620 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c   pCur is not NUL
12630 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65  L and is.** a re
12640 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a  ad-only cursor..
12650 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12660 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a  r occurs, then *
12670 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69  ppPage is undefi
12680 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
12690 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
126a0 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
126b0 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
126c0 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
126d0 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
126e0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
126f0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
12700 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
12710 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
12720 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
12750 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
12760 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
12770 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
12780 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
12790 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
127a0 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
127b0 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
127c0 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
127d0 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
127e0 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  page, or NULL */
127f0 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79  .  int bReadOnly
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12810 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
12820 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20   read-only page 
12830 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12840 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
12850 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
12860 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12870 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12880 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
12890 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75   || ppPage==&pCu
128a0 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
128b0 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
128c0 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
128d0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
128e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
128f0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
12900 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
12910 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
12920 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
12930 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12940 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
12950 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
12960 65 5f 65 72 72 6f 72 31 3b 0a 20 20 7d 0a 20 20  e_error1;.  }.  
12970 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12980 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
12990 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
129a0 2a 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61  *)&pDbPage, bRea
129b0 64 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63  dOnly);.  if( rc
129c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74   ){.    goto get
129d0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
129e0 72 31 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67  r1;.  }.  *ppPag
129f0 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71  e = (MemPage*)sq
12a00 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
12a10 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69  ra(pDbPage);.  i
12a20 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73  f( (*ppPage)->is
12a30 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62  Init==0 ){.    b
12a40 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
12a50 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
12a60 2c 20 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  , pBt);.    rc =
12a70 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a   btreeInitPage(*
12a80 70 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  ppPage);.    if(
12a90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12aa0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67 65 74  {.      goto get
12ab0 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12ac0 72 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r2;.    }.  }.  
12ad0 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65  assert( (*ppPage
12ae0 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b  )->pgno==pgno );
12af0 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
12b00 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  age)->aData==sql
12b10 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12b20 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  (pDbPage) );..  
12b30 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67 20  /* If obtaining 
12b40 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f 72  a child page for
12b50 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d 75   a cursor, we mu
12b60 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20 74  st verify that t
12b70 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a 20  he page is.  ** 
12b80 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
12b90 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 2a  the root page. *
12ba0 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26 20  /.  if( pCur && 
12bb0 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65 6c  ((*ppPage)->nCel
12bc0 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  l<1 || (*ppPage)
12bd0 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d 3e  ->intKey!=pCur->
12be0 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20 20  curIntKey) ){.  
12bf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
12c00 52 52 55 50 54 5f 50 47 4e 4f 28 70 67 6e 6f 29  RRUPT_PGNO(pgno)
12c10 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
12c20 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32  dInitPage_error2
12c30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
12c40 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41 6e  QLITE_OK;..getAn
12c50 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 32  dInitPage_error2
12c60 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
12c70 2a 70 70 50 61 67 65 29 3b 0a 67 65 74 41 6e 64  *ppPage);.getAnd
12c80 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 31 3a  InitPage_error1:
12c90 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a 20  .  if( pCur ){. 
12ca0 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d     pCur->iPage--
12cb0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67  ;.    pCur->pPag
12cc0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
12cd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
12ce0 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20 70   }.  testcase( p
12cf0 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
12d00 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
12d10 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
12d20 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
12d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
12d40 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
12d50 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
12d60 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
12d70 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
12d80 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
12d90 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20 69 73  ..**.** Page1 is
12da0 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20   a special case 
12db0 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65 6c 65  and must be rele
12dc0 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c 65 61  ased using relea
12dd0 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a 2f 0a  sePageOne()..*/.
12de0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
12df0 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
12e00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
12e10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
12e20 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
12e30 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
12e40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
12e50 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
12e60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
12e70 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
12e80 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
12e90 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
12ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12eb0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
12ec0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
12ed0 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
12ee0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
12ef0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
12f00 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
12f10 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
12f20 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
12f30 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
12f40 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
12f50 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
12f60 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
12f70 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
12f80 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
12f90 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ge);.}.static vo
12fa0 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e  id releasePageOn
12fb0 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
12fc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
12fd0 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
12fe0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
12ff0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
13000 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
13010 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50  ert( pPage->pDbP
13020 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  age!=0 );.  asse
13030 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
13040 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
13050 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
13060 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
13070 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
13080 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
13090 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
130a0 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73  ->aData );.  ass
130b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
130c0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
130d0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
130e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
130f0 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65 2d 3e  fPageOne(pPage->
13100 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  pDbPage);.}../*.
13110 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64  ** Get an unused
13120 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   page..**.** Thi
13130 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
13140 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  e btreeGetPage()
13150 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
13160 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49  on:.**.**   *  I
13170 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
13180 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72  ready in use for
13190 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
131a0 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79  ose, immediately
131b0 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65  .**      release
131c0 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61   it and return a
131d0 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54  n SQLITE_CURRUPT
131e0 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20   error..**   *  
131f0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73  Make sure the is
13200 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65  Init flag is cle
13210 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ar.*/.static int
13220 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
13230 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
13240 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
13250 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
13260 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
13270 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
13280 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
13290 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
132a0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
132b0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
132c0 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
132d0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
132e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
132f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
13300 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
13310 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
13320 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65  int rc = btreeGe
13330 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
13340 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
13350 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
13370 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13380 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
13390 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
133a0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
133b0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
133c0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
133d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
133e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
133f0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
13400 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
13410 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
13420 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
13430 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
13440 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  .../*.** During 
13450 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
13460 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
13470 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
13480 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
13490 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
134a0 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
134b0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
134c0 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
134d0 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
134e0 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
134f0 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
13500 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13510 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
13520 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
13530 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
13540 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
13550 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
13560 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
13570 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
13580 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
13590 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
135a0 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
135b0 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
135c0 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
135d0 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
135e0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
135f0 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
13600 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
13610 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
13620 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
13630 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
13640 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
13650 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
13660 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
13670 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
13680 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
13690 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
136a0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
136b0 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
136c0 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
136d0 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
136e0 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
136f0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
13700 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
13710 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
13720 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
13730 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
13740 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
13750 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
13760 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
13770 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
13780 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
13790 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
137a0 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
137b0 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
137c0 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
137d0 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
137e0 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
137f0 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
13800 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
13810 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
13820 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
13830 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
13840 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
13850 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
13860 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
13870 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
13880 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
13890 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
138a0 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
138b0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
138c0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
138d0 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
138e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
138f0 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
13900 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
13910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
13920 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
13930 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
13940 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
13950 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
13960 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
13970 75 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20 20 20  usyHandler,.    
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
139a0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
139b0 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a 7d 0a  Bt->pPager));.}.
139c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61  ./*.** Open a da
139d0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20  tabase file..** 
139e0 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73  .** zFilename is
139f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13a00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13a10 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
13a20 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e   NULL.** then an
13a30 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62   ephemeral datab
13a40 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ase is created. 
13a50 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64   The ephemeral d
13a60 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a  atabase might.**
13a70 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20   be exclusively 
13a80 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74  in memory, or it
13a90 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73   might use a dis
13aa0 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63  k-based memory c
13ab0 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20  ache..** Either 
13ac0 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72  way, the ephemer
13ad0 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  al database will
13ae0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
13af0 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68  y deleted .** wh
13b00 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  en sqlite3BtreeC
13b10 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64  lose() is called
13b20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
13b30 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
13b40 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65  :" then an in-me
13b50 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
13b60 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74   created.** that
13b70 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   is automaticall
13b80 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e  y destroyed when
13b90 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
13ba0 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22  *.** The "flags"
13bb0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
13bc0 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67  bitmask that mig
13bd0 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20  ht contain bits 
13be0 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d  like.** BTREE_OM
13bf0 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f  IT_JOURNAL and/o
13c00 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a  r BTREE_MEMORY..
13c10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
13c20 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
13c30 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73   opened in the s
13c40 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
13c50 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77  nection.** and w
13c60 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20  e are in shared 
13c70 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e  cache mode, then
13c80 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66   the open will f
13c90 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53  ail with an.** S
13ca0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13cb0 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e   error.  We cann
13cc0 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20  ot allow two or 
13cd0 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a  more BtShared.**
13ce0 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20   objects in the 
13cf0 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
13d00 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64  nnection since d
13d10 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61  oing so will lea
13d20 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73  d.** to problems
13d30 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   with locking..*
13d40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
13d50 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  eeOpen(.  sqlite
13d60 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
13d70 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20    /* VFS to use 
13d80 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20  for this b-tree 
13d90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
13da0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
13db0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
13dc0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
13dd0 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
13de0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
13df0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
13e00 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
13e10 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
13e20 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
13e30 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
13e40 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
13e50 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
13e60 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
13e70 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
13e80 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
13e90 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
13ea0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
13eb0 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
13ec0 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
13ed0 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42  Open() */.){.  B
13ee0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30  tShared *pBt = 0
13ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13f00 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20   Shared part of 
13f10 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
13f20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20  */.  Btree *p;  
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f40 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
13f50 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c   return */.  sql
13f60 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
13f70 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50  xOpen = 0;  /* P
13f80 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63  revents a race c
13f90 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74  ondition. Ticket
13fa0 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20   #3537 */.  int 
13fb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
13fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13fd0 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74  sult code from t
13fe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
13ff0 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20    u8 nReserve;  
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14010 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73   /* Byte of unus
14020 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68  ed space on each
14030 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
14040 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64  ned char zDbHead
14050 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74  er[100];  /* Dat
14060 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e  abase header con
14070 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72  tent */..  /* Tr
14080 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e  ue if opening an
14090 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70   ephemeral, temp
140a0 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a  orary database *
140b0 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73  /.  const int is
140c0 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61  TempDb = zFilena
140d0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
140e0 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  me[0]==0;..  /* 
140f0 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65  Set the variable
14100 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65   isMemdb to true
14110 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   for an in-memor
14120 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a  y database, or .
14130 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61    ** false for a
14140 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61   file-based data
14150 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  base..  */.#ifde
14160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
14170 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69  MORYDB.  const i
14180 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a  nt isMemdb = 0;.
14190 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e  #else.  const in
141a0 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69  t isMemdb = (zFi
141b0 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70  lename && strcmp
141c0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65  (zFilename, ":me
141d0 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20  mory:")==0).    
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20     || (isTempDb 
14200 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  && sqlite3TempIn
14210 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20  Memory(db)).    
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14230 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20     || (vfsFlags 
14240 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  & SQLITE_OPEN_ME
14250 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66  MORY)!=0;.#endif
14260 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
14270 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14280 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Vfs!=0 );.  asse
14290 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
142a0 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
142b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
142c0 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61  flags&0xff)==fla
142d0 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73  gs );   /* flags
142e0 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a   fit in 8 bits *
142f0 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42  /..  /* Only a B
14300 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
14310 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45  base can be BTRE
14320 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20  E_UNORDERED */. 
14330 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
14340 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45  & BTREE_UNORDERE
14350 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  D)==0 || (flags 
14360 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21  & BTREE_SINGLE)!
14370 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54  =0 );..  /* A BT
14380 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
14390 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20  ase is always a 
143a0 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72  temporary and/or
143b0 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20   ephemeral */.  
143c0 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
143d0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d   BTREE_SINGLE)==
143e0 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b  0 || isTempDb );
143f0 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20  ..  if( isMemdb 
14400 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  ){.    flags |= 
14410 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20  BTREE_MEMORY;.  
14420 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67  }.  if( (vfsFlag
14430 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
14440 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28  MAIN_DB)!=0 && (
14450 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d  isMemdb || isTem
14460 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46  pDb) ){.    vfsF
14470 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73  lags = (vfsFlags
14480 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   & ~SQLITE_OPEN_
14490 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54  MAIN_DB) | SQLIT
144a0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a  E_OPEN_TEMP_DB;.
144b0 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
144c0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
144d0 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66  of(Btree));.  if
144e0 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75  ( !p ){.    retu
144f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
14500 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  BKPT;.  }.  p->i
14510 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
14520 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64  ONE;.  p->db = d
14530 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
14540 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
14550 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42  CHE.  p->lock.pB
14560 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c  tree = p;.  p->l
14570 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a  ock.iTable = 1;.
14580 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66  #endif..#if !def
14590 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
145a0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
145b0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
145c0 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
145d0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   /*.  ** If this
145e0 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e 64   Btree is a cand
145f0 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65 64  idate for shared
14600 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66   cache, try to f
14610 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73  ind an.  ** exis
14620 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62  ting BtShared ob
14630 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61 6e  ject that we can
14640 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f   share with.  */
14650 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62 3d  .  if( isTempDb=
14660 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d  =0 && (isMemdb==
14670 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26 53  0 || (vfsFlags&S
14680 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21  QLITE_OPEN_URI)!
14690 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20 76  =0) ){.    if( v
146a0 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
146b0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
146c0 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  E ){.      int n
146d0 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Filename = sqlit
146e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
146f0 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20 69  name)+1;.      i
14700 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  nt nFullPathname
14710 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
14720 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61  ame+1;.      cha
14730 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
14740 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
14750 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61  (MAX(nFullPathna
14760 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  me,nFilename));.
14770 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49        MUTEX_LOGI
14780 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  C( sqlite3_mutex
14790 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20 29   *mutexShared; )
147a0 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61  ..      p->shara
147b0 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  ble = 1;.      i
147c0 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  f( !zFullPathnam
147d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  e ){.        sql
147e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
147f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14800 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
14810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14820 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
14830 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
14840 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
14850 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29  name, nFilename)
14860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14870 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14880 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
14890 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
148a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
148d0 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
148e0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
148f0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
14900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
14910 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
14920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14930 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
14940 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14960 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
14970 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
14980 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
14990 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
149a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
149b0 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
149c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
149d0 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
149e0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
149f0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
14a00 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
14a10 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
14a20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14a30 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
14a40 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
14a50 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
14a60 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14a70 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14a80 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
14a90 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
14aa0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
14ab0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
14ac0 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
14ad0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
14ae0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
14af0 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
14b00 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
14b10 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
14b20 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
14b30 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
14b40 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
14b50 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
14b60 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
14b70 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
14b80 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
14b90 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
14ba0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
14bc0 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
14bd0 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
14be0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14c00 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
14c10 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
14c20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14c30 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
14c40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
14c50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14c60 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14c70 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14c80 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
14c90 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14ca0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
14cb0 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
14cc0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
14cd0 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
14ce0 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
14cf0 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
14d00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14d30 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
14d40 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
14d50 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
14d60 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
14d70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
14d80 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
14d90 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
14da0 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
14db0 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
14dc0 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
14dd0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
14de0 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
14df0 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
14e00 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
14e10 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
14e20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
14e30 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
14e40 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
14e50 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
14e60 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
14e70 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
14e80 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
14e90 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
14ea0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
14eb0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
14ec0 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
14ed0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
14ee0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
14ef0 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
14f00 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
14f10 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
14f20 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
14f30 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
14f40 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
14f50 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
14f60 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
14f70 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
14f80 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
14f90 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
14fa0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
14fb0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
14fc0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
14fd0 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
14fe0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
14ff0 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
15000 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
15010 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
15020 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
15030 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
15040 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
15050 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
15060 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
15070 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
15080 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15090 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
150a0 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
150b0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
150c0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
150d0 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
150e0 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
150f0 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
15100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15110 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d 50       sizeof(MemP
15120 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66 73  age), flags, vfs
15130 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e 69  Flags, pageReini
15140 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
15150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15160 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
15170 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
15180 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d  >pPager, db->szM
15190 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  map);.      rc =
151a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 61   sqlite3PagerRea
151b0 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74 2d  dFileheader(pBt-
151c0 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a  >pPager,sizeof(z
151d0 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65 61  DbHeader),zDbHea
151e0 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  der);.    }.    
151f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15200 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
15210 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
15220 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f      }.    pBt->o
15230 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29 66  penFlags = (u8)f
15240 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64  lags;.    pBt->d
15250 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c 69  b = db;.    sqli
15260 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79 48  te3PagerSetBusyH
15270 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61 67  andler(pBt->pPag
15280 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65 42  er, btreeInvokeB
15290 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74 29  usyHandler, pBt)
152a0 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70  ;.    p->pBt = p
152b0 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e  Bt;.  .    pBt->
152c0 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20  pCursor = 0;.   
152d0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
152e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
152f0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
15300 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 20  (pBt->pPager) ) 
15310 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
15320 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
15330 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
15340 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
15350 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  ).    pBt->btsFl
15360 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
15370 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69 66 20  E_DELETE;.#elif 
15380 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 46  defined(SQLITE_F
15390 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  AST_SECURE_DELET
153a0 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  E).    pBt->btsF
153b0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56 45 52  lags |= BTS_OVER
153c0 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20  WRITE;.#endif.  
153d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
153e0 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
153f0 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
15400 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
15410 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
15420 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
15430 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
15440 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
15450 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
15460 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
15470 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
15480 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
15490 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
154a0 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b  ze = (zDbHeader[
154b0 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65  16]<<8) | (zDbHe
154c0 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  ader[17]<<16);. 
154d0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65     if( pBt->page
154e0 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d  Size<512 || pBt-
154f0 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45  >pageSize>SQLITE
15500 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20  _MAX_PAGE_SIZE. 
15510 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74          || ((pBt
15520 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42  ->pageSize-1)&pB
15530 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20  t->pageSize)!=0 
15540 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ){.      pBt->pa
15550 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e  geSize = 0;.#ifn
15560 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15570 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
15580 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63   /* If the magic
15590 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22   name ":memory:"
155a0 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20   will create an 
155b0 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
155c0 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  se, then.      *
155d0 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f  * leave the auto
155e0 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30  Vacuum mode at 0
155f0 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61   (do not auto-va
15600 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20  cuum), even if. 
15610 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44       ** SQLITE_D
15620 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
15630 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68  M is true. On th
15640 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66  e other hand, if
15650 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
15660 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68  _OMIT_MEMORYDB h
15670 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c  as been defined,
15680 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22   then ":memory:"
15690 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20   is just a.     
156a0 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65   ** regular file
156b0 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63  -name. In this c
156c0 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63  ase the auto-vac
156d0 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70  uum applies as p
156e0 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20  er normal..     
156f0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46   */.      if( zF
15700 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65  ilename && !isMe
15710 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70  mdb ){.        p
15720 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
15730 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54   (SQLITE_DEFAULT
15740 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20  _AUTOVACUUM ? 1 
15750 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  : 0);.        pB
15760 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
15770 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
15780 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20  AUTOVACUUM==2 ? 
15790 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  1 : 0);.      }.
157a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65  #endif.      nRe
157b0 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d  serve = 0;.    }
157c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45  else{.      /* E
157d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
157e0 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69  497-42412 The si
157f0 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76  ze of the reserv
15800 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20  ed region is.   
15810 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
15820 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
15830 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
15840 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
15850 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20  fset of 20.     
15860 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74   ** into the dat
15870 61 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65  abase file heade
15880 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73  r. */.      nRes
15890 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72  erve = zDbHeader
158a0 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d  [20];.      pBt-
158b0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
158c0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
158d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
158e0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
158f0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
15900 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15910 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
15920 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
15930 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
15940 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
15950 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
15960 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
15970 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  if.    }.    rc 
15980 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  = sqlite3PagerSe
15990 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70  tPagesize(pBt->p
159a0 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67  Pager, &pBt->pag
159b0 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29  eSize, nReserve)
159c0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
159d0 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
159e0 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ut;.    pBt->usa
159f0 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
15a00 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
15a10 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ve;.    assert( 
15a20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26  (pBt->pageSize &
15a30 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d   7)==0 );  /* 8-
15a40 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f  byte alignment o
15a50 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20  f pageSize */.  
15a60 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53   .#if !defined(S
15a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15a80 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
15a90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
15aa0 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20  _DISKIO).    /* 
15ab0 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68  Add the new BtSh
15ac0 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74  ared object to t
15ad0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
15ae0 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64  harable BtShared
15af0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42  s..    */.    pB
15b00 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  t->nRef = 1;.   
15b10 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
15b20 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
15b30 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
15b40 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
15b50 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58  d; ).      MUTEX
15b60 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61  _LOGIC( mutexSha
15b70 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  red = sqlite3Mut
15b80 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15b90 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
15ba0 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20  ER);).      if( 
15bb0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
15bc0 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62  E && sqlite3Glob
15bd0 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
15be0 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  tex ){.        p
15bf0 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  Bt->mutex = sqli
15c00 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
15c10 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29  LITE_MUTEX_FAST)
15c20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 42  ;.        if( pB
15c30 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  t->mutex==0 ){. 
15c40 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
15c50 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
15c60 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
15c70 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
15c80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15c90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
15ca0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
15cb0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
15cc0 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
15cd0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
15ce0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
15cf0 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
15d00 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
15d10 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
15d20 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
15d30 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
15d40 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
15d50 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
15d60 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
15d70 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15d80 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
15d90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15da0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
15db0 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
15dc0 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
15dd0 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
15de0 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
15df0 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
15e00 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
15e10 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
15e20 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
15e30 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
15e40 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
15e50 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
15e60 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
15e70 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
15e80 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
15e90 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
15ea0 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
15eb0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
15ec0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
15ed0 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
15ee0 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
15ef0 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
15f00 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
15f10 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
15f20 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
15f30 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
15f40 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75   (uptr)p->pBt<(u
15f50 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b  ptr)pSib->pBt ){
15f60 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
15f70 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
15f80 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
15f90 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
15fa0 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
15fb0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15fc0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
15fd0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75  Sib->pNext && (u
15fe0 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d  ptr)pSib->pNext-
15ff0 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42  >pBt<(uptr)p->pB
16000 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
16010 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e   pSib = pSib->pN
16020 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ext;.          }
16030 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
16040 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  ext = pSib->pNex
16050 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  t;.          p->
16060 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20  pPrev = pSib;.  
16070 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70          if( p->p
16080 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
16090 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50      p->pNext->pP
160a0 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  rev = p;.       
160b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
160c0 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a  Sib->pNext = p;.
160d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
160e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
160f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
16100 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70  f.  *ppBtree = p
16110 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75  ;..btree_open_ou
16120 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  t:.  if( rc!=SQL
16130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
16140 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
16150 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71  ager ){.      sq
16160 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
16170 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b  pBt->pPager, 0);
16180 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
16190 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
161a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
161b0 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20  );.    *ppBtree 
161c0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
161d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
161e0 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49  pFile;..    /* I
161f0 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
16200 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
16210 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
16220 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
16230 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
16240 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
16250 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
16260 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
16270 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
16280 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
16290 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
162a0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
162b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
162c0 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
162d0 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
162e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
162f0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
16300 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
16310 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
16320 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
16330 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71  ..    pFile = sq
16340 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70  lite3PagerFile(p
16350 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
16360 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74   if( pFile->pMet
16370 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71  hods ){.      sq
16380 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
16390 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51  olHint(pFile, SQ
163a0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20  LITE_FCNTL_PDB, 
163b0 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29  (void*)&pBt->db)
163c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
163d0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
163e0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
163f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
16400 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
16410 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
16420 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
16430 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63    }.  assert( rc
16440 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
16450 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65  qlite3BtreeConne
16460 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74  ctionCount(*ppBt
16470 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75  ree)>0 );.  retu
16480 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16490 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74  Decrement the Bt
164a0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
164b0 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65  ter.  When it re
164c0 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72  aches zero,.** r
164d0 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68 61 72  emove the BtShar
164e0 65 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ed structure fro
164f0 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  m the sharing li
16500 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  st.  Return.** t
16510 72 75 65 20 69 66 20 74 68 65 20 42 74 53 68 61  rue if the BtSha
16520 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
16530 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e   reaches zero an
16540 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73  d return.** fals
16550 65 20 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c  e if it is still
16560 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74   positive..*/.st
16570 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46  atic int removeF
16580 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42  romSharingList(B
16590 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23  tShared *pBt){.#
165a0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
165b0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
165c0 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
165d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
165e0 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61  aster; ).  BtSha
165f0 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e  red *pList;.  in
16600 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a  t removed = 0;..
16610 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
16620 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28  3_mutex_notheld(
16630 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
16640 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d   MUTEX_LOGIC( pM
16650 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
16660 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
16670 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
16680 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74  STER); ).  sqlit
16690 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
166a0 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
166b0 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
166c0 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
166d0 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53    if( GLOBAL(BtS
166e0 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
166f0 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d  aredCacheList)==
16700 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f  pBt ){.      GLO
16710 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
16720 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
16730 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65  List) = pBt->pNe
16740 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  xt;.    }else{. 
16750 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f       pList = GLO
16760 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
16770 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
16780 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69  List);.      whi
16790 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74  le( ALWAYS(pList
167a0 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78  ) && pList->pNex
167b0 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  t!=pBt ){.      
167c0 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70    pList=pList->p
167d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
167e0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
167f0 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20  List) ){.       
16800 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20   pList->pNext = 
16810 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pBt->pNext;.    
16820 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
16830 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
16840 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  AFE ){.      sql
16850 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
16860 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  pBt->mutex);.   
16870 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d   }.    removed =
16880 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   1;.  }.  sqlite
16890 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
168a0 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
168b0 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a   removed;.#else.
168c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
168d0 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  if.}../*.** Make
168e0 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53   sure pBt->pTmpS
168f0 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  pace points to a
16900 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20  n allocation of 
16910 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  .** MX_CELL_SIZE
16920 28 70 42 74 29 20 62 79 74 65 73 20 77 69 74 68  (pBt) bytes with
16930 20 61 20 34 2d 62 79 74 65 20 70 72 65 66 69 78   a 4-byte prefix
16940 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c   for a left-chil
16950 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  d.** pointer..*/
16960 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c  .static void all
16970 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 42  ocateTempSpace(B
16980 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
16990 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53   if( !pBt->pTmpS
169a0 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d  pace ){.    pBt-
169b0 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
169c0 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20  ite3PageMalloc( 
169d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
169e0 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20  ..    /* One of 
169f0 74 68 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d  the uses of pBt-
16a00 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f  >pTmpSpace is to
16a10 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65   format cells be
16a20 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65  fore.    ** inse
16a30 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20  rting them into 
16a40 61 20 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e  a leaf page (fun
16a50 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c  ction fillInCell
16a60 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ()). If.    ** a
16a70 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68   cell is less th
16a80 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  an 4 bytes in si
16a90 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65  ze, it is rounde
16aa0 64 20 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a  d up to 4 bytes.
16ab0 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61      ** by the va
16ac0 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74  rious routines t
16ad0 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62  hat manipulate b
16ae0 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69  inary cells. Whi
16af0 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65  ch.    ** can me
16b00 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65  an that fillInCe
16b10 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61  ll() only initia
16b20 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73 74 20  lizes the first 
16b30 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79  2 or 3.    ** by
16b40 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65  tes of pTmpSpace
16b50 2c 20 62 75 74 20 74 68 61 74 20 74 68 65 20 66  , but that the f
16b60 69 72 73 74 20 34 20 62 79 74 65 73 20 61 72 65  irst 4 bytes are
16b70 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20   copied from.   
16b80 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61   ** it into a da
16b90 74 61 62 61 73 65 20 70 61 67 65 2e 20 54 68 69  tabase page. Thi
16ba0 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c  s is not actuall
16bb0 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74  y a problem, but
16bc0 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
16bd0 63 61 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64  cause a valgrind
16be0 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20   error when the 
16bf0 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20  1 or 2 bytes of 
16c00 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20  unitialized .   
16c10 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61 73 73   ** data is pass
16c20 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c  ed to system cal
16c30 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f  l write(). So to
16c40 20 61 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f   avoid this erro
16c50 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74  r,.    ** zero t
16c60 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
16c70 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65 20 68   of temp space h
16c80 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ere..    **.    
16c90 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64  ** Also:  Provid
16ca0 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20  e four bytes of 
16cb0 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
16cc0 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  e before the.   
16cd0 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   ** beginning of
16ce0 20 70 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e   pTmpSpace as an
16cf0 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20   area available 
16d00 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20  to prepend the. 
16d10 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64     ** left-child
16d20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
16d30 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63  beginning of a c
16d40 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
16d50 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  if( pBt->pTmpSpa
16d60 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  ce ){.      mems
16d70 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  et(pBt->pTmpSpac
16d80 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20  e, 0, 8);.      
16d90 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b  pBt->pTmpSpace +
16da0 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 4;.    }.  }.}
16db0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
16dc0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
16dd0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
16de0 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65  atic void freeTe
16df0 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
16e00 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42   *pBt){.  if( pB
16e10 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
16e20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16e30 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c  ce -= 4;.    sql
16e40 69 74 65 33 50 61 67 65 46 72 65 65 28 70 42 74  ite3PageFree(pBt
16e50 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20  ->pTmpSpace);.  
16e60 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16e70 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
16e80 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e  ** Close an open
16e90 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e   database and in
16ea0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72  validate all cur
16eb0 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sors..*/.int sql
16ec0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42  ite3BtreeClose(B
16ed0 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
16ee0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16ef0 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  Bt;.  BtCursor *
16f00 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  pCur;..  /* Clos
16f10 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70  e all cursors op
16f20 65 6e 65 64 20 76 69 61 20 74 68 69 73 20 68 61  ened via this ha
16f30 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ndle.  */.  asse
16f40 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16f50 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16f60 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
16f70 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16f80 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43    pCur = pBt->pC
16f90 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20  ursor;.  while( 
16fa0 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75  pCur ){.    BtCu
16fb0 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75  rsor *pTmp = pCu
16fc0 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43  r;.    pCur = pC
16fd0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69  ur->pNext;.    i
16fe0 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d  f( pTmp->pBtree=
16ff0 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =p ){.      sqli
17000 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
17010 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d  sor(pTmp);.    }
17020 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62  .  }..  /* Rollb
17030 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74  ack any active t
17040 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66  ransaction and f
17050 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73  ree the handle s
17060 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54  tructure..  ** T
17070 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
17080 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
17090 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c  ) drops any tabl
170a0 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a  e-locks held by.
170b0 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65    ** this handle
170c0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
170d0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c  BtreeRollback(p,
170e0 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
170f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17100 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  ave(p);..  /* If
17110 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
17120 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69   other outstandi
17130 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  ng references to
17140 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
17150 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65  e.  ** structure
17160 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68  , return now. Th
17170 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74  e remainder of t
17180 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
17190 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68  eans .  ** up th
171a0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a  e shared-btree..
171b0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
171c0 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20  ->wantToLock==0 
171d0 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  && p->locked==0 
171e0 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61  );.  if( !p->sha
171f0 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46  rable || removeF
17200 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70  romSharingList(p
17210 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  Bt) ){.    /* Th
17220 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67  e pBt is no long
17230 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e  er on the sharin
17240 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61  g list, so we ca
17250 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20  n access.    ** 
17260 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  it without havin
17270 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  g to hold the mu
17280 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tex..    **.    
17290 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64  ** Clean out and
172a0 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53 68   delete the BtSh
172b0 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20  ared object..   
172c0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
172d0 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b  !pBt->pCursor );
172e0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
172f0 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67  rClose(pBt->pPag
17300 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20  er, p->db);.    
17310 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
17320 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
17330 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
17340 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
17350 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
17360 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
17370 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53  bFree(0, pBt->pS
17380 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65  chema);.    free
17390 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
173a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
173b0 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  (pBt);.  }..#ifn
173c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
173d0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61  SHARED_CACHE.  a
173e0 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
173f0 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Lock==0 );.  ass
17400 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  ert( p->locked==
17410 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50  0 );.  if( p->pP
17420 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e  rev ) p->pPrev->
17430 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
17440 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  ;.  if( p->pNext
17450 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72   ) p->pNext->pPr
17460 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23  ev = p->pPrev;.#
17470 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
17480 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75  _free(p);.  retu
17490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
174a0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
174b0 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f  e "soft" limit o
174c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
174d0 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63  pages in the cac
174e0 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e  he..** Unused an
174f0 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67  d unmodified pag
17500 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63  es will be recyc
17510 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d  led when the num
17520 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20  ber of.** pages 
17530 69 6e 20 74 68 65 20 63 61 63 68 65 20 65 78 63  in the cache exc
17540 65 65 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c  eeds this soft l
17550 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65 20 73  imit.  But the s
17560 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ize of the.** ca
17570 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  che is allowed t
17580 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68  o grow larger th
17590 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66  an this limit if
175a0 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
175b0 64 69 72 74 79 20 70 61 67 65 73 20 6f 72 20 70  dirty pages or p
175c0 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63  ages still in ac
175d0 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  tive use..*/.int
175e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
175f0 43 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20  CacheSize(Btree 
17600 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
17610 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17620 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17630 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17640 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17650 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17660 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17670 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
17680 65 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d  etCachesize(pBt-
17690 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
176a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
176b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
176c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
176d0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
176e0 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20  e "spill" limit 
176f0 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
17700 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
17710 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e  che..** If the n
17720 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 65  umber of pages e
17730 78 63 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69  xceeds this limi
17740 74 20 64 75 72 69 6e 67 20 61 20 77 72 69 74 65  t during a write
17750 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
17760 20 74 68 65 20 70 61 67 65 72 20 6d 69 67 68 74   the pager might
17770 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69   attempt to "spi
17780 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74 68 65  ll" pages to the
17790 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69   journal early i
177a0 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72  n.** order to fr
177b0 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  ee up memory..**
177c0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
177d0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 63 75  turned is the cu
177e0 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65  rrent spill size
177f0 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61  .  If zero is pa
17800 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72  ssed.** as an ar
17810 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67  gument, no chang
17820 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74  es are made to t
17830 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65  he spill size se
17840 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69  tting, so.** usi
17850 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69  ng mxPage of 0 i
17860 73 20 61 20 77 61 79 20 74 6f 20 71 75 65 72 79  s a way to query
17870 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 70 69   the current spi
17880 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20  ll size..*/.int 
17890 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53  sqlite3BtreeSetS
178a0 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a  pillSize(Btree *
178b0 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
178c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
178d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
178e0 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73  res;.  assert( s
178f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
17900 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
17910 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
17920 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73  eEnter(p);.  res
17930 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17940 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d  etSpillsize(pBt-
17950 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
17960 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17970 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17980 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53  rn res;.}..#if S
17990 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
179a0 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  IZE>0./*.** Chan
179b0 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20  ge the limit on 
179c0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68  the amount of th
179d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
179e0 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d  that may be.** m
179f0 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f  emory mapped..*/
17a00 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
17a10 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74  eSetMmapLimit(Bt
17a20 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  ree *p, sqlite3_
17a30 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20  int64 szMmap){. 
17a40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
17a50 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
17a60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
17a70 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
17a80 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
17a90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17aa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
17ab0 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70  MmapLimit(pBt->p
17ac0 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a  Pager, szMmap);.
17ad0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
17ae0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
17af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
17b00 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
17b10 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
17b20 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  /../*.** Change 
17b30 74 68 65 20 77 61 79 20 64 61 74 61 20 69 73 20  the way data is 
17b40 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69  synced to disk i
17b50 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65  n order to incre
17b60 61 73 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a  ase or decrease.
17b70 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20  ** how well the 
17b80 64 61 74 61 62 61 73 65 20 72 65 73 69 73 74 73  database resists
17b90 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f   damage due to O
17ba0 53 20 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f  S crashes and po
17bb0 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e  wer.** failures.
17bc0 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65    Level 1 is the
17bd0 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72   same as asynchr
17be0 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28  onous (no syncs(
17bf0 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74  ) occur and.** t
17c00 68 65 72 65 20 69 73 20 61 20 68 69 67 68 20 70  here is a high p
17c10 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
17c20 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69  mage)  Level 2 i
17c30 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  s the default.  
17c40 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65  There.** is a ve
17c50 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a  ry low but non-z
17c60 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20  ero probability 
17c70 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65  of damage.  Leve
17c80 6c 20 33 20 72 65 64 75 63 65 73 20 74 68 65 0a  l 3 reduces the.
17c90 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  ** probability o
17ca0 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72  f damage to near
17cb0 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68 20 61   zero but with a
17cc0 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e   write performan
17cd0 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f  ce reduction..*/
17ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17cf0 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d  OMIT_PAGER_PRAGM
17d00 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  AS.int sqlite3Bt
17d10 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67 73  reeSetPagerFlags
17d20 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20  (.  Btree *p,   
17d30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
17d40 65 20 62 74 72 65 65 20 74 6f 20 73 65 74 20 74  e btree to set t
17d50 68 65 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20  he safety level 
17d60 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  on */.  unsigned
17d70 20 70 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f   pgFlags       /
17d80 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f  * Various PAGER_
17d90 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  * flags */.){.  
17da0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
17db0 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
17dc0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
17dd0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
17de0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
17df0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
17e00 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 46  sqlite3PagerSetF
17e10 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72  lags(pBt->pPager
17e20 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71  , pgFlags);.  sq
17e30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
17e40 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
17e50 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
17e60 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
17e70 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
17e80 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
17e90 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
17ea0 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
17eb0 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
17ec0 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
17ed0 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
17ee0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
17ef0 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
17f00 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
17f10 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
17f20 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
17f30 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
17f40 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
17f50 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
17f60 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
17f70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
17f80 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
17f90 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
17fa0 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
17fb0 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
17fc0 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
17fd0 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
17fe0 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
17ff0 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
18000 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
18010 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
18020 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
18030 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
18040 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
18050 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
18060 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
18070 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
18080 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
18090 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
180a0 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
180b0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
180c0 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
180d0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
180e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
180f0 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
18100 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
18110 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
18120 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
18130 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
18140 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
18150 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
18160 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
18170 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
18180 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
18190 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
181a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
181b0 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
181c0 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
181d0 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
181e0 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
181f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18200 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
18210 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
18220 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
18230 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
18240 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
18250 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
18260 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
18270 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73  CODEC.  if( nRes
18280 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  erve>pBt->optima
18290 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e  lReserve ) pBt->
182a0 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d  optimalReserve =
182b0 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23   (u8)nReserve;.#
182c0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d  endif.  if( pBt-
182d0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
182e0 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
182f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
18300 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
18310 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
18320 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
18330 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
18340 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
18350 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
18360 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
18370 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
18380 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
18390 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
183a0 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
183b0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
183c0 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
183d0 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
183e0 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
183f0 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
18400 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
18410 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
18420 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
18430 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
18440 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
18450 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
18460 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
18470 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
18480 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18490 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
184a0 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
184b0 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
184c0 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
184d0 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
184e0 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
184f0 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
18500 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
18510 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
18520 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
18530 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18540 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18550 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
18560 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
18570 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
18580 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
18590 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
185a0 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
185b0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
185c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
185d0 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
185e0 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
185f0 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
18600 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
18610 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
18620 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
18630 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
18640 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
18650 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
18660 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
18670 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
18680 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
18690 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
186a0 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
186b0 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
186c0 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
186d0 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
186e0 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
186f0 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
18700 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
18710 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
18720 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
18730 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
18740 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
18750 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
18760 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
18770 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
18780 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
18790 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
187a0 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
187b0 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
187c0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
187d0 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
187e0 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
187f0 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  p){.  int n;.  a
18800 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
18810 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
18820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20  ->mutex) );.  n 
18830 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
18840 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
18850 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  bleSize;.  retur
18860 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
18870 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
18880 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
18890 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
188a0 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
188b0 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
188c0 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
188d0 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
188e0 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
188f0 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
18900 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
18910 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sions..**.** If 
18920 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58  SQLITE_HAS_MUTEX
18930 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
18940 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   the number retu
18950 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67  rned is the.** g
18960 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75  reater of the cu
18970 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73  rrent reserved s
18980 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78  pace and the max
18990 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a  imum requested.*
189a0 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e  * reserve space.
189b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
189c0 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
189d0 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
189e0 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
189f0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
18a00 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ;.  n = sqlite3B
18a10 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
18a20 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66  Mutex(p);.#ifdef
18a30 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
18a40 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74  C.  if( n<p->pBt
18a50 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
18a60 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f   ) n = p->pBt->o
18a70 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23  ptimalReserve;.#
18a80 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
18a90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
18aa0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
18ab0 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
18ac0 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
18ad0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
18ae0 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
18af0 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
18b00 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
18b10 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
18b20 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
18b30 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
18b40 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
18b50 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
18b60 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
18b70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18b80 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
18b90 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
18ba0 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
18bb0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18bc0 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
18bd0 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
18be0 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
18bf0 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
18c00 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18c10 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
18c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
18c30 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   the values for 
18c40 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
18c50 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f 4f 56  ELETE and BTS_OV
18c60 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a 0a 2a  ERWRITE flags:.*
18c70 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  *.**    newFlag=
18c80 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20 42 54  =0       Both BT
18c90 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  S_SECURE_DELETE 
18ca0 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52 49 54  and BTS_OVERWRIT
18cb0 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  E are cleared.**
18cc0 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31 20 20      newFlag==1  
18cd0 20 20 20 20 20 42 54 53 5f 53 45 43 55 52 45 5f       BTS_SECURE_
18ce0 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64 20 42  DELETE set and B
18cf0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
18d00 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20 6e 65  cleared.**    ne
18d10 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20 20 42  wFlag==2       B
18d20 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
18d30 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42 54 53   cleared and BTS
18d40 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 73 65  _OVERWRITE is se
18d50 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d  t.**    newFlag=
18d60 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68 61 6e  =(-1)    No chan
18d70 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ges.**.** This r
18d80 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
18d90 20 71 75 65 72 79 20 69 66 20 6e 65 77 46 6c 61   query if newFla
18da0 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a  g is less than z
18db0 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 42  ero.**.** With B
18dc0 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73 65 74  TS_OVERWRITE set
18dd0 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e  , deleted conten
18de0 74 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  t is overwritten
18df0 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74 0a 2a   by zeros, but.*
18e00 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20  * freelist leaf 
18e10 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20 77 72  pages are not wr
18e20 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
18e30 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 75  e database.  Thu
18e40 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64 65 6c  s in-page.** del
18e50 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69 73 20  eted content is 
18e60 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66 72 65  cleared, but fre
18e70 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20 63 6f  elist deleted co
18e80 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a 2a 2a  ntent is not..**
18e90 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53 45 43  .** With BTS_SEC
18ea0 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70 65 72  URE_DELETE, oper
18eb0 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20 42 54  ation is like BT
18ec0 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69 74 68  S_OVERWRITE with
18ed0 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a 2a 2a   the addition.**
18ee0 20 74 68 61 74 20 66 72 65 65 6c 69 73 74 20 6c   that freelist l
18ef0 65 61 66 20 70 61 67 65 73 20 61 72 65 20 77 72  eaf pages are wr
18f00 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20  itten back into 
18f10 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 6e  the database, in
18f20 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68 65 20  creasing.** the 
18f30 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b 20 49  amount of disk I
18f40 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  /O..*/.int sqlit
18f50 65 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c  e3BtreeSecureDel
18f60 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ete(Btree *p, in
18f70 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e  t newFlag){.  in
18f80 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  t b;.  if( p==0 
18f90 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71  ) return 0;.  sq
18fa0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
18fb0 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54  p);.  assert( BT
18fc0 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42 54 53  S_OVERWRITE==BTS
18fd0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 32  _SECURE_DELETE*2
18fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 42 54   );.  assert( BT
18ff0 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d 3d 28  S_FAST_SECURE==(
19000 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c 42 54  BTS_OVERWRITE|BT
19010 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29  S_SECURE_DELETE)
19020 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61   );.  if( newFla
19030 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70  g>=0 ){.    p->p
19040 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
19050 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45  ~BTS_FAST_SECURE
19060 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62 74  ;.    p->pBt->bt
19070 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45  sFlags |= BTS_SE
19080 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65 77 46  CURE_DELETE*newF
19090 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d 20 28  lag;.  }.  b = (
190a0 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
190b0 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45 43 55   & BTS_FAST_SECU
190c0 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45 5f 44  RE)/BTS_SECURE_D
190d0 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74 65 33  ELETE;.  sqlite3
190e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
190f0 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
19100 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
19110 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
19120 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
19130 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
19140 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
19150 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
19160 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
19170 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
19180 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
19190 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
191a0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
191b0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
191c0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
191d0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
191e0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
191f0 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
19200 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
19210 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
19220 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
19230 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
19240 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
19250 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
19260 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
19270 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
19280 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
19290 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
192a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
192b0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
192c0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
192d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
192e0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
192f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
19300 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
19310 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
19320 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
19330 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
19340 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
19350 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
19360 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
19370 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
19380 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
19390 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
193a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
193b0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
193c0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
193d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
193e0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
193f0 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
19400 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
19410 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
19420 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
19430 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
19440 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19450 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
19460 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
19470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
19480 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
19490 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
194a0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
194b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
194c0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
194d0 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
194e0 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
194f0 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
19500 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
19510 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
19520 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
19530 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
19540 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
19550 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
19560 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19570 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19580 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
19590 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
195a0 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61 66 65  not set the safe
195b0 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74 68 69  ty-level for thi
195c0 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
195d0 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67 20 22  ction.** using "
195e0 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
195f0 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68 65 20  us", and if the 
19600 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69 73 20  safety-level is 
19610 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73  not already.** s
19620 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
19630 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
19640 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65 20 73  unction as the s
19650 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 2c  econd parameter,
19660 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e 0a 2a  .** set it so..*
19670 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  /.#if SQLITE_DEF
19680 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
19690 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  !=SQLITE_DEFAULT
196a0 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
196b0 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66 69 6e   \.    && !defin
196c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
196d0 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  AL).static void 
196e0 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63 46 6c  setDefaultSyncFl
196f0 61 67 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ag(BtShared *pBt
19700 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65 76 65  , u8 safety_leve
19710 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  l){.  sqlite3 *d
19720 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20  b;.  Db *pDb;.  
19730 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29  if( (db=pBt->db)
19740 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e  !=0 && (pDb=db->
19750 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 77  aDb)!=0 ){.    w
19760 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74 3d 3d  hile( pDb->pBt==
19770 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d 3e 70  0 || pDb->pBt->p
19780 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62 2b 2b  Bt!=pBt ){ pDb++
19790 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44 62 2d  ; }.    if( pDb-
197a0 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a 20 20  >bSyncSet==0 .  
197b0 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
197c0 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74 79 5f  y_level!=safety_
197d0 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26 20 70  level .     && p
197e0 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31 5d 20  Db!=&db->aDb[1] 
197f0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 44  .    ){.      pD
19800 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  b->safety_level 
19810 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 3b 0a  = safety_level;.
19820 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
19830 65 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e  erSetFlags(pBt->
19840 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20  pPager,.        
19850 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
19860 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
19870 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
19880 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ASK));.    }.  }
19890 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
198a0 65 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  e setDefaultSync
198b0 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74 79 5f  Flag(pBt,safety_
198c0 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a 0a 2f  level).#endif../
198d0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
198e0 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
198f0 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
19900 42 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a 2f 2a  BtShared*);.../*
19910 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
19920 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
19930 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19940 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
19950 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
19960 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
19970 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
19980 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
19990 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
199a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
199b0 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
199c0 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
199d0 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
199e0 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
199f0 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
19a00 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
19a10 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
19a20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
19a30 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
19a40 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
19a50 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
19a60 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
19a70 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
19a80 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
19a90 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
19aa0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
19ab0 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e  from subfunction
19ac0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
19ad0 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50  pPage1;     /* P
19ae0 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74  age 1 of the dat
19af0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
19b00 75 33 32 20 6e 50 61 67 65 3b 20 20 20 20 20 20  u32 nPage;      
19b10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
19b20 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
19b30 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 33 32  atabase */.  u32
19b40 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20   nPageFile = 0; 
19b50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
19b60 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
19b70 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
19b80 33 32 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20  32 nPageHeader; 
19b90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
19ba0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19bb0 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
19bc0 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73   to hdr */..  as
19bd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
19be0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
19bf0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
19c00 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
19c10 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
19c20 65 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63  e3PagerSharedLoc
19c30 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
19c40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19c50 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
19c60 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  .  rc = btreeGet
19c70 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
19c80 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
19c90 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19ca0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
19cb0 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
19cc0 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
19cd0 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
19ce0 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
19cf0 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
19d00 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
19d10 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48    nPage = nPageH
19d20 65 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65  eader = get4byte
19d30 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
19d40 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74  >aData);.  sqlit
19d50 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
19d60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 28 69  (pBt->pPager, (i
19d70 6e 74 2a 29 26 6e 50 61 67 65 46 69 6c 65 29 3b  nt*)&nPageFile);
19d80 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20  .  if( nPage==0 
19d90 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38  || memcmp(24+(u8
19da0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
19db0 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d   92+(u8*)pPage1-
19dc0 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a  >aData,4)!=0 ){.
19dd0 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67      nPage = nPag
19de0 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  eFile;.  }.  if(
19df0 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
19e00 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44   & SQLITE_ResetD
19e10 61 74 61 62 61 73 65 29 21 3d 30 20 29 7b 0a 20  atabase)!=0 ){. 
19e20 20 20 20 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20     nPage = 0;.  
19e30 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
19e40 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
19e50 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
19e60 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
19e70 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
19e80 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
19e90 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
19ea0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19eb0 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
19ec0 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
19ed0 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
19ee0 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
19ef0 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
19f00 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
19f10 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
19f20 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
19f30 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
19f40 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
19f50 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
19f60 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
19f70 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
19f80 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
19f90 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
19fa0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
19fb0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
19fc0 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
19fd0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
19fe0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
19ff0 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
1a000 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
1a010 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
1a020 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1a030 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
1a040 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
1a050 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
1a060 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1a070 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
1a080 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
1a090 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
1a0a0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
1a0b0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
1a0c0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
1a0d0 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
1a0e0 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
1a0f0 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
1a100 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
1a110 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
1a120 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
1a130 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
1a140 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
1a150 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
1a160 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
1a170 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
1a180 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
1a190 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
1a1a0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
1a1b0 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
1a1c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
1a1d0 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
1a1e0 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
1a1f0 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
1a200 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
1a210 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
1a220 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
1a230 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
1a240 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
1a250 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
1a260 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
1a270 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1a280 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
1a290 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
1a2a0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1a2b0 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
1a2c0 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
1a2d0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
1a2e0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
1a2f0 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
1a300 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
1a310 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a320 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
1a330 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
1a340 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
1a350 7b 0a 20 20 20 20 20 20 20 20 73 65 74 44 65 66  {.        setDef
1a360 61 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74  aultSyncFlag(pBt
1a370 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
1a380 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
1a390 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  +1);.        if(
1a3a0 20 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20   isOpen==0 ){.  
1a3b0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1a3c0 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a  ageOne(pPage1);.
1a3d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1a3e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1a400 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a410 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 65 6c 73  NOTADB;.    }els
1a420 65 7b 0a 20 20 20 20 20 20 73 65 74 44 65 66 61  e{.      setDefa
1a430 75 6c 74 53 79 6e 63 46 6c 61 67 28 70 42 74 2c  ultSyncFlag(pBt,
1a440 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1a450 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a  SYNCHRONOUS+1);.
1a460 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1a470 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a480 3a 20 52 2d 31 35 34 36 35 2d 32 30 38 31 33 20  : R-15465-20813 
1a490 54 68 65 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20  The maximum and 
1a4a0 6d 69 6e 69 6d 75 6d 20 65 6d 62 65 64 64 65 64  minimum embedded
1a4b0 20 70 61 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20   payload.    ** 
1a4c0 66 72 61 63 74 69 6f 6e 73 20 61 6e 64 20 74 68  fractions and th
1a4d0 65 20 6c 65 61 66 20 70 61 79 6c 6f 61 64 20 66  e leaf payload f
1a4e0 72 61 63 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d  raction values m
1a4f0 75 73 74 20 62 65 20 36 34 2c 20 33 32 2c 20 61  ust be 64, 32, a
1a500 6e 64 20 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  nd 32..    **.  
1a510 20 20 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61    ** The origina
1a520 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64  l design allowed
1a530 20 74 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74   these amounts t
1a540 6f 20 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f  o vary, but as o
1a550 66 0a 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e  f.    ** version
1a560 20 33 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69   3.6.0, we requi
1a570 72 65 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69  re them to be fi
1a580 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  xed..    */.    
1a590 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65  if( memcmp(&page
1a5a0 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30  1[21], "\100\040
1a5b0 5c 30 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20  \040",3)!=0 ){. 
1a5c0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
1a5d0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
1a5e0 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e   }.    /* EVIDEN
1a5f0 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
1a600 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
1a610 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
1a620 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
1a630 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1a640 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
1a650 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
1a660 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
1a670 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
1a680 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1a690 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a6a0 65 2e 20 2a 2f 0a 20 20 20 20 70 61 67 65 53 69  e. */.    pageSi
1a6b0 7a 65 20 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c  ze = (page1[16]<
1a6c0 3c 38 29 20 7c 20 28 70 61 67 65 31 5b 31 37 5d  <8) | (page1[17]
1a6d0 3c 3c 31 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56  <<16);.    /* EV
1a6e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30  IDENCE-OF: R-250
1a6f0 30 38 2d 32 31 36 38 38 20 54 68 65 20 73 69 7a  08-21688 The siz
1a700 65 20 6f 66 20 61 20 70 61 67 65 20 69 73 20 61  e of a page is a
1a710 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 0a 20 20   power of two.  
1a720 20 20 2a 2a 20 62 65 74 77 65 65 6e 20 35 31 32    ** between 512
1a730 20 61 6e 64 20 36 35 35 33 36 20 69 6e 63 6c 75   and 65536 inclu
1a740 73 69 76 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sive. */.    if(
1a750 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
1a760 61 67 65 53 69 7a 65 29 21 3d 30 0a 20 20 20 20  ageSize)!=0.    
1a770 20 7c 7c 20 70 61 67 65 53 69 7a 65 3e 53 51 4c   || pageSize>SQL
1a780 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
1a790 45 20 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53  E .     || pageS
1a7a0 69 7a 65 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b  ize<=256 .    ){
1a7b0 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
1a7c0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
1a7d0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 62 74     }.    pBt->bt
1a7e0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
1a7f0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
1a800 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
1a810 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
1a820 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a830 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
1a840 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
1a850 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
1a860 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
1a870 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
1a880 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
1a890 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
1a8a0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
1a8b0 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
1a8c0 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
1a8d0 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
1a8e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
1a8f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
1a900 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
1a910 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
1a920 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
1a930 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
1a940 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
1a950 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
1a960 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
1a970 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
1a980 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
1a990 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
1a9a0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
1a9b0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
1a9c0 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
1a9d0 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
1a9e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
1a9f0 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
1aa00 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
1aa10 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1aa20 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
1aa30 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
1aa40 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
1aa50 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
1aa60 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
1aa70 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
1aa80 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
1aa90 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
1aaa0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
1aab0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
1aac0 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
1aad0 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
1aae0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
1aaf0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
1ab00 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
1ab10 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
1ab20 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1ab30 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
1ab40 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
1ab50 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31 29  ePageOne(pPage1)
1ab60 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
1ab70 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
1ab80 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
1ab90 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
1aba0 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
1abb0 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
1abc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1abd0 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1abe0 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
1abf0 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a  &pBt->pageSize,.
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62     pageSize-usab
1ac30 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  leSize);.      r
1ac40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1ac50 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
1ac60 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28 70 42  ritableSchema(pB
1ac70 74 2d 3e 64 62 29 3d 3d 30 20 26 26 20 6e 50 61  t->db)==0 && nPa
1ac80 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
1ac90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1aca0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1acb0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
1acc0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
1acd0 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
1ace0 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
1acf0 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
1ad00 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
1ad10 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
1ad20 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
1ad30 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
1ad40 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
1ad50 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
1ad60 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
1ad70 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
1ad80 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
1ad90 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
1ada0 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
1adb0 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
1adc0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
1add0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
1ade0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
1adf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
1ae00 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
1ae10 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
1ae20 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ae30 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
1ae40 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
1ae50 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
1ae60 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
1ae70 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
1ae80 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
1ae90 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
1aea0 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
1aeb0 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
1aec0 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
1aed0 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
1aee0 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
1aef0 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
1af00 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
1af10 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
1af20 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
1af30 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
1af40 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
1af50 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
1af60 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
1af70 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
1af80 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
1af90 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
1afa0 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
1afb0 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
1afc0 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
1afd0 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
1afe0 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
1aff0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
1b000 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
1b010 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
1b020 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
1b030 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
1b040 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
1b050 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
1b060 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
1b070 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
1b080 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
1b090 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
1b0a0 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
1b0b0 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
1b0c0 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
1b0d0 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
1b0e0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
1b0f0 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
1b100 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
1b110 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
1b120 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
1b130 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
1b140 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
1b150 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
1b160 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
1b170 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
1b180 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
1b190 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1b1a0 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
1b1b0 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
1b1c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1b1d0 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
1b1e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
1b1f0 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
1b200 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
1b210 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
1b220 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
1b230 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
1b240 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
1b250 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
1b260 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
1b270 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
1b280 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
1b290 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
1b2a0 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
1b2b0 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
1b2c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
1b2d0 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
1b2e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e  .  releasePageOn
1b2f0 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74  e(pPage1);.  pBt
1b300 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
1b310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1b320 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a  fndef NDEBUG./*.
1b330 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1b340 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
1b350 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69  open on pBt. Thi
1b360 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
1b370 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
1b380 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
1b390 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
1b3a0 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
1b3b0 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
1b3c0 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75  ** Only write cu
1b3d0 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65  rsors are counte
1b3e0 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74  d if wrOnly is t
1b3f0 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20  rue.  If wrOnly 
1b400 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e  is.** false then
1b410 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
1b420 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   counted..**.** 
1b430 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
1b440 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
1b450 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e  , a cursor is an
1b460 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
1b470 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72   is capable of r
1b480 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1b490 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1b4a0 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61 74  e.  Cursors that
1b4b0 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72  .** have been tr
1b4c0 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43  ipped into the C
1b4d0 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74  URSOR_FAULT stat
1b4e0 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65  e are not counte
1b4f0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1b500 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
1b510 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
1b520 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20  , int wrOnly){. 
1b530 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
1b540 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
1b550 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
1b560 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
1b570 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
1b580 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d      if( (wrOnly=
1b590 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72  =0 || (pCur->cur
1b5a0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
1b5b0 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20  teFlag)!=0).    
1b5c0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
1b5d0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
1b5e0 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
1b5f0 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
1b600 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
1b610 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1b620 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
1b630 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
1b640 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
1b650 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
1b660 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
1b670 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1b680 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
1b690 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
1b6a0 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
1b6b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b6c0 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
1b6d0 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
1b6e0 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
1b6f0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
1b700 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74   If there is a t
1b710 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
1b720 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75  ogress, this rou
1b730 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1b740 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1b750 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1b760 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70 42  sed(BtShared *pB
1b770 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t){.  assert( sq
1b780 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b790 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1b7a0 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56    assert( countV
1b7b0 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c  alidCursors(pBt,
1b7c0 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e  0)==0 || pBt->in
1b7d0 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e  Transaction>TRAN
1b7e0 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  S_NONE );.  if( 
1b7f0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1b800 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  on==TRANS_NONE &
1b810 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  & pBt->pPage1!=0
1b820 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
1b830 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70  *pPage1 = pBt->p
1b840 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72  Page1;.    asser
1b850 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t( pPage1->aData
1b860 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b870 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
1b880 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1b890 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==1 );.    pBt-
1b8a0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
1b8b0 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65 28   releasePageOne(
1b8c0 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  pPage1);.  }.}..
1b8d0 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f 69  /*.** If pBt poi
1b8e0 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79 20  nts to an empty 
1b8f0 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65 72  file then conver
1b900 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69 6c  t that empty fil
1b910 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77 20  e.** into a new 
1b920 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20 62  empty database b
1b930 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
1b940 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
1b950 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1b960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b970 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
1b980 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
1b990 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
1b9a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
1b9b0 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  a;.  int rc;..  
1b9c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b9d0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1b9e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
1b9f0 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  pBt->nPage>0 ){.
1ba00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ba10 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31 20  E_OK;.  }.  pP1 
1ba20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20  = pBt->pPage1;. 
1ba30 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30 20   assert( pP1!=0 
1ba40 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31 2d  );.  data = pP1-
1ba50 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20 73  >aData;.  rc = s
1ba60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ba70 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pP1->pDbPage);.
1ba80 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1ba90 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28 64  n rc;.  memcpy(d
1baa0 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64 65  ata, zMagicHeade
1bab0 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69 63  r, sizeof(zMagic
1bac0 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73 65  Header));.  asse
1bad0 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  rt( sizeof(zMagi
1bae0 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b 0a  cHeader)==16 );.
1baf0 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75 38    data[16] = (u8
1bb00 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  )((pBt->pageSize
1bb10 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >>8)&0xff);.  da
1bb20 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28 70  ta[17] = (u8)((p
1bb30 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31 36  Bt->pageSize>>16
1bb40 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61 5b  )&0xff);.  data[
1bb50 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b  18] = 1;.  data[
1bb60 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65 72  19] = 1;.  asser
1bb70 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
1bb80 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  ze<=pBt->pageSiz
1bb90 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c 65  e && pBt->usable
1bba0 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e 70  Size+255>=pBt->p
1bbb0 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
1bbc0 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74 2d  [20] = (u8)(pBt-
1bbd0 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d  >pageSize - pBt-
1bbe0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
1bbf0 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20  data[21] = 64;. 
1bc00 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a   data[22] = 32;.
1bc10 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b    data[23] = 32;
1bc20 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b  .  memset(&data[
1bc30 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b  24], 0, 100-24);
1bc40 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c  .  zeroPage(pP1,
1bc50 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f   PTF_INTKEY|PTF_
1bc60 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54  LEAF|PTF_LEAFDAT
1bc70 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73 46  A );.  pBt->btsF
1bc80 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45  lags |= BTS_PAGE
1bc90 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e  SIZE_FIXED;.#ifn
1bca0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bcb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73  AUTOVACUUM.  ass
1bcc0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
1bcd0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
1bce0 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b  autoVacuum==0 );
1bcf0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1bd00 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  incrVacuum==1 ||
1bd10 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1bd20 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74  ==0 );.  put4byt
1bd30 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34  e(&data[36 + 4*4
1bd40 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  ], pBt->autoVacu
1bd50 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  um);.  put4byte(
1bd60 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c  &data[36 + 7*4],
1bd70 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
1bd80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 2d  );.#endif.  pBt-
1bd90 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64 61  >nPage = 1;.  da
1bda0 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72 65  ta[31] = 1;.  re
1bdb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bdc0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
1bdd0 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70 61  ize the first pa
1bde0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
1bdf0 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69 6e  se file (creatin
1be00 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  g a database.** 
1be10 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
1be20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64 20  single page and 
1be30 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  no schema object
1be40 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s). Return SQLIT
1be50 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63 65  E_OK.** if succe
1be60 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
1be70 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  ite error code o
1be80 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e 74  therwise..*/.int
1be90 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 77   sqlite3BtreeNew
1bea0 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  Db(Btree *p){.  
1beb0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1bec0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1bed0 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20    p->pBt->nPage 
1bee0 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77 44  = 0;.  rc = newD
1bef0 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29 3b  atabase(p->pBt);
1bf00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1bf10 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1bf20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1bf30 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74 20  ttempt to start 
1bf40 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1bf50 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  n. A write-trans
1bf60 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74 61  action.** is sta
1bf70 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63 6f  rted if the seco
1bf80 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  nd argument is n
1bf90 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  onzero, otherwis
1bfa0 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72 61  e a read-.** tra
1bfb0 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74 68  nsaction.  If th
1bfc0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1bfd0 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20 61  t is 2 or more a
1bfe0 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20  nd exclusive.** 
1bff0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 73  transaction is s
1c000 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67 20  tarted, meaning 
1c010 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72  that no other pr
1c020 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65 64  ocess is allowed
1c030 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
1c040 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20 70  e database.  A p
1c050 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e 73  reexisting trans
1c060 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20 62  action may not b
1c070 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74 6f  e.** upgraded to
1c080 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63 61   exclusive by ca
1c090 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
1c0a0 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d 65  ne a second time
1c0b0 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75 73   - the.** exclus
1c0c0 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79 20  ivity flag only 
1c0d0 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77 20  works for a new 
1c0e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
1c0f0 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73  ** A write-trans
1c100 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 73  action must be s
1c110 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61 74  tarted before at
1c120 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a 2a  tempting any .**
1c130 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
1c140 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
1c150 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1c160 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77 69   routines .** wi
1c170 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20 61  ll work unless a
1c180 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
1c190 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a 2a  started first:.*
1c1a0 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  *.**      sqlite
1c1b0 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62 6c  3BtreeCreateTabl
1c1c0 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1c1d0 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49 6e  te3BtreeCreateIn
1c1e0 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  dex().**      sq
1c1f0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
1c200 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1c210 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
1c220 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1c230 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
1c240 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  t().**      sqli
1c250 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 29  te3BtreeDelete()
1c260 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
1c270 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
1c280 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ).**.** If an in
1c290 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74 6f  itial attempt to
1c2a0 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f 63   acquire the loc
1c2b0 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65 20  k fails because 
1c2c0 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  of lock contenti
1c2d0 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  on.** and the da
1c2e0 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76 69  tabase was previ
1c2f0 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c 20  ously unlocked, 
1c300 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
1c310 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a 20  busy handler.** 
1c320 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
1c330 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20 77    But if there w
1c340 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61 20  as previously a 
1c350 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f  read-lock, do no
1c360 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65 20  t.** invoke the 
1c370 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20 6a  busy handler - j
1c380 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
1c390 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45 5f  E_BUSY.  SQLITE_
1c3a0 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74 75  BUSY is .** retu
1c3b0 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65 20  rned when there 
1c3c0 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65 61  is already a rea
1c3d0 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72 20  d-lock in order 
1c3e0 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64 6c  to avoid a deadl
1c3f0 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ock..**.** Suppo
1c400 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  se there are two
1c410 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e 64   processes A and
1c420 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65 61   B.  A has a rea
1c430 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61 73  d lock and B has
1c440 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20 6c  .** a reserved l
1c450 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74 6f  ock.  B tries to
1c460 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63 6c   promote to excl
1c470 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c 6f  usive but is blo
1c480 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a 20  cked because.** 
1c490 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63 6b  of A's read lock
1c4a0 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70 72  .  A tries to pr
1c4b0 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76 65  omote to reserve
1c4c0 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  d but is blocked
1c4d0 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72   by B..** One or
1c4e0 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
1c4f0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1c500 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f 72  must give way or
1c510 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
1c520 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20 42   no progress.  B
1c530 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49  y returning SQLI
1c540 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74 20  TE_BUSY and not 
1c550 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75 73  invoking the bus
1c560 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68  y callback.** wh
1c570 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61 73  en A already has
1c580 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77 65   a read lock, we
1c590 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f 20   encourage A to 
1c5a0 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74 20  give up and let 
1c5b0 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a 2f  B.** proceed..*/
1c5c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1c5d0 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72 65  eBeginTrans(Btre
1c5e0 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61 67  e *p, int wrflag
1c5f0 2c 20 69 6e 74 20 2a 70 53 63 68 65 6d 61 56 65  , int *pSchemaVe
1c600 72 73 69 6f 6e 29 7b 0a 20 20 42 74 53 68 61 72  rsion){.  BtShar
1c610 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1c620 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1c630 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
1c640 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1c650 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1c660 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1c670 68 65 20 62 74 72 65 65 20 69 73 20 61 6c 72 65  he btree is alre
1c680 61 64 79 20 69 6e 20 61 20 77 72 69 74 65 2d 74  ady in a write-t
1c690 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69  ransaction, or i
1c6a0 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72 65 61 64  t.  ** is alread
1c6b0 79 20 69 6e 20 61 20 72 65 61 64 2d 74 72 61 6e  y in a read-tran
1c6c0 73 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 72 65  saction and a re
1c6d0 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  ad-transaction. 
1c6e0 20 2a 2a 20 69 73 20 72 65 71 75 65 73 74 65 64   ** is requested
1c6f0 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
1c700 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  p..  */.  if( p-
1c710 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1c720 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54  WRITE || (p->inT
1c730 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44  rans==TRANS_READ
1c740 20 26 26 20 21 77 72 66 6c 61 67 29 20 29 7b 0a   && !wrflag) ){.
1c750 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
1c760 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  egun;.  }.  asse
1c770 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1c780 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1c790 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74  ITE || IfNotOmit
1c7a0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
1c7b0 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  ate)==0 );..  if
1c7c0 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  ( (p->db->flags 
1c7d0 26 20 53 51 4c 49 54 45 5f 52 65 73 65 74 44 61  & SQLITE_ResetDa
1c7e0 74 61 62 61 73 65 29 20 0a 20 20 20 26 26 20 73  tabase) .   && s
1c7f0 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
1c800 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
1c810 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  r)==0 .  ){.    
1c820 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1c830 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b   ~BTS_READ_ONLY;
1c840 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65  .  }..  /* Write
1c850 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72   transactions ar
1c860 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f  e not possible o
1c870 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
1c880 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20  tabase */.  if( 
1c890 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1c8a0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21   BTS_READ_ONLY)!
1c8b0 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  =0 && wrflag ){.
1c8c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c8d0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f  READONLY;.    go
1c8e0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1c8f0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
1c900 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
1c910 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20 73 71  CACHE.  {.    sq
1c920 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20  lite3 *pBlock = 
1c930 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61 6e 6f  0;.    /* If ano
1c940 74 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61  ther database ha
1c950 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79  ndle has already
1c960 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20   opened a write 
1c970 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20  transaction .   
1c980 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61 72   ** on this shar
1c990 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74 75  ed-btree structu
1c9a0 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64 20  re and a second 
1c9b0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1c9c0 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75  n is.    ** requ
1c9d0 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
1c9e0 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20 20 20  LITE_LOCKED..   
1c9f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 72 66   */.    if( (wrf
1ca00 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  lag && pBt->inTr
1ca10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1ca20 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c 7c 20  _WRITE).     || 
1ca30 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
1ca40 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21 3d 30   BTS_PENDING)!=0
1ca50 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 70 42  .    ){.      pB
1ca60 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1ca70 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c  ter->db;.    }el
1ca80 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
1ca90 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63 6b 20  ){.      BtLock 
1caa0 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20 66 6f  *pIter;.      fo
1cab0 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
1cac0 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
1cad0 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
1cae0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
1caf0 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a  r->pBtree!=p ){.
1cb00 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f 63 6b            pBlock
1cb10 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65   = pIter->pBtree
1cb20 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1cb30 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1cb40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cb50 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b     if( pBlock ){
1cb60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
1cb70 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
1cb80 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a  p->db, pBlock);.
1cb90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cba0 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
1cbb0 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ACHE;.      goto
1cbc0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1cbd0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1cbe0 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1cbf0 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1cc00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1cc10 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1cc20 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1cc30 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1cc40 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1cc50 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1cc60 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1cc70 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1cc80 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1cc90 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1cca0 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1ccb0 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1ccc0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1ccd0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1cce0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1ccf0 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1cd00 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1cd10 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1cd20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1cd30 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1cd40 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1cd50 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1cd60 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1cd70 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1cd80 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1cd90 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1cda0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1cdb0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1cdc0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1cdd0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1cde0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1cdf0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1ce00 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1ce10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1ce20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1ce30 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1ce40 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1ce50 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1ce60 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1ce70 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1ce80 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1ce90 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1cea0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1ceb0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1cec0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1ced0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1cee0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1cef0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1cf00 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1cf10 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1cf20 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1cf30 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1cf40 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1cf50 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1cf60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1cf70 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1cf80 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1cf90 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1cfa0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1cfb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1cfc0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1cfd0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1cfe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1cff0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
1d000 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
1d010 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
1d020 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
1d030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d040 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1d050 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1d060 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
1d070 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d080 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 26 26  BUSY_SNAPSHOT &&
1d090 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1d0a0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1d0b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1d0c0 69 66 20 74 68 65 72 65 20 77 61 73 20 6e 6f 20  if there was no 
1d0d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1d0e0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1d0f0 63 74 69 6f 6e 20 77 61 73 0a 20 20 20 20 20 20  ction was.      
1d100 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 20 61 6e      ** called an
1d110 64 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  d SQLITE_BUSY_SN
1d120 41 50 53 48 4f 54 20 69 73 20 72 65 74 75 72 6e  APSHOT is return
1d130 65 64 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65  ed, change the e
1d140 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
1d150 2a 20 63 6f 64 65 20 74 6f 20 53 51 4c 49 54 45  * code to SQLITE
1d160 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 20 20 20 20  _BUSY. */.      
1d170 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d180 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BUSY;.        }.
1d190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d1a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d1b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d1c0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1d1d0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1d1e0 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1d1f0 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1d200 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1d210 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1d220 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1d230 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1d240 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 20  andler(pBt) );. 
1d250 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 73   sqlite3PagerRes
1d260 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74 28 70 42  etLockTimeout(pB
1d270 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 69  t->pPager);..  i
1d280 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1d290 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
1d2a0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1d2b0 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
1d2c0 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
1d2d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1d2e0 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1d2f0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
1d300 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
1d310 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1d320 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
1d330 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
1d340 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
1d350 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
1d360 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
1d370 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
1d380 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1d390 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
1d3a0 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
1d3b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1d3c0 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1d3d0 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
1d3e0 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
1d3f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
1d400 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
1d410 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1d420 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1d430 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
1d440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d450 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1d460 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1d470 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
1d480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1d490 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1d4a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1d4b0 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
1d4c0 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
1d4d0 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
1d4e0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1d4f0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
1d500 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
1d510 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1d520 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
1d530 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
1d540 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
1d550 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
1d560 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
1d570 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
1d580 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
1d590 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
1d5a0 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
1d5b0 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
1d5c0 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
1d5d0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
1d5e0 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
1d5f0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
1d600 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
1d610 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
1d620 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
1d630 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
1d640 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
1d650 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
1d660 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
1d670 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1d680 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
1d690 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1d6a0 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
1d6b0 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
1d6c0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1d6d0 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
1d6e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1d6f0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1d700 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1d710 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d720 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1d730 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1d740 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1d750 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
1d760 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1d770 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f 62 65 67 75  .  }..trans_begu
1d780 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  n:.  if( rc==SQL
1d790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1d7a0 28 20 70 53 63 68 65 6d 61 56 65 72 73 69 6f 6e  ( pSchemaVersion
1d7b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 63 68 65   ){.      *pSche
1d7c0 6d 61 56 65 72 73 69 6f 6e 20 3d 20 67 65 74 34  maVersion = get4
1d7d0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1d7e0 31 2d 3e 61 44 61 74 61 5b 34 30 5d 29 3b 0a 20  1->aData[40]);. 
1d7f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66     }.    if( wrf
1d800 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lag ){.      /* 
1d810 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20  This call makes 
1d820 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61  sure that the pa
1d830 67 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72  ger has the corr
1d840 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  ect number of.  
1d850 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65      ** open save
1d860 70 6f 69 6e 74 73 2e 20 49 66 20 74 68 65 20 73  points. If the s
1d870 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
1d880 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1d890 30 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74  0 and.      ** t
1d8a0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69  he sub-journal i
1d8b0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
1d8c0 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c  en, then it will
1d8d0 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65 2e   be opened here.
1d8e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d8f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1d900 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
1d910 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64  Bt->pPager, p->d
1d920 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a  b->nSavepoint);.
1d930 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62 74 72      }.  }..  btr
1d940 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1d950 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1d960 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1d970 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1d980 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1d990 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1d9a0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1d9b0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1d9c0 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1d9d0 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1d9e0 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1d9f0 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1da00 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1da10 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1da20 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1da30 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1da40 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1da50 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1da60 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1da70 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1da80 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1dab0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1dac0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dae0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1daf0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1db00 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1db10 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db30 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1db40 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1db50 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1db60 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1db70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
1db80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1db90 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1dba0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1dbb0 20 20 72 63 20 3d 20 70 50 61 67 65 2d 3e 69 73    rc = pPage->is
1dbc0 49 6e 69 74 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  Init ? SQLITE_OK
1dbd0 20 3a 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   : btreeInitPage
1dbe0 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1dbf0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1dc00 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e 43 65 6c  eturn rc;.  nCel
1dc10 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1dc20 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1dc30 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1dc40 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1dc50 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1dc60 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1dc70 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 50  vflPtr(pPage, pP
1dc80 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29  age, pCell, &rc)
1dc90 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ;..    if( !pPag
1dca0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1dcb0 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1dcc0 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  = get4byte(pCell
1dcd0 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  );.      ptrmapP
1dce0 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
1dcf0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
1dd00 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20   pgno, &rc);.   
1dd10 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
1dd20 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1dd30 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1dd40 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1dd50 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1dd60 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1dd70 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1dd80 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54  t, childPgno, PT
1dd90 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f  RMAP_BTREE, pgno
1dda0 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 72  , &rc);.  }..  r
1ddb0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ddc0 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20  ** Somewhere on 
1ddd0 70 50 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74  pPage is a point
1dde0 65 72 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d  er to page iFrom
1ddf0 2e 20 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70  .  Modify this p
1de00 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61  ointer so.** tha
1de10 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69  t it points to i
1de20 54 6f 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54  To. Parameter eT
1de30 79 70 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ype describes th
1de40 65 20 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65  e type of pointe
1de50 72 20 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66  r to.** be modif
1de60 69 65 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73  ied, as  follows
1de70 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42  :.**.** PTRMAP_B
1de80 54 52 45 45 3a 20 20 20 20 20 70 50 61 67 65 20  TREE:     pPage 
1de90 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1dea0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1deb0 6e 74 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a  nts at a child .
1dec0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1ded0 20 20 20 20 20 70 61 67 65 20 6f 66 20 70 50 61       page of pPa
1dee0 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1def0 5f 4f 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67  _OVERFLOW1: pPag
1df00 65 20 69 73 20 61 20 62 74 72 65 65 2d 70 61 67  e is a btree-pag
1df10 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
1df20 6f 69 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72  oints at an over
1df30 66 6c 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20  flow.**         
1df40 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20 70            page p
1df50 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65  ointed to by one
1df60 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e   of the cells on
1df70 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1df80 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20  RMAP_OVERFLOW2: 
1df90 70 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72  pPage is an over
1dfa0 66 6c 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70  flow-page. The p
1dfb0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
1dfc0 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20   the next.**    
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1dfe0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
1dff0 74 68 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  the list..*/.sta
1e000 74 69 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61  tic int modifyPa
1e010 67 65 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67  gePointer(MemPag
1e020 65 20 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69  e *pPage, Pgno i
1e030 46 72 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20  From, Pgno iTo, 
1e040 75 38 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73  u8 eType){.  ass
1e050 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1e060 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1e070 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e080 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
1e090 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1e0a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
1e0b0 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  );.  if( eType==
1e0c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1e0d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
1e0e0 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73  ointer is always
1e0f0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
1e100 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  es of the page i
1e110 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f  n this case.  */
1e120 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74  .    if( get4byt
1e130 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21  e(pPage->aData)!
1e140 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
1e150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1e160 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
1e170 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74  );.    }.    put
1e180 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1e190 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73  ta, iTo);.  }els
1e1a0 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  e{.    int i;.  
1e1b0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1e1c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1e1d0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1e1e0 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 62   ? SQLITE_OK : b
1e1f0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1e200 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
1e210 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1e220 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
1e230 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
1e240 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
1e250 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
1e260 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
1e270 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
1e280 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1e290 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
1e2a0 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
1e2b0 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50  info;.        pP
1e2c0 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
1e2d0 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
1e2e0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
1e2f0 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e  ( info.nLocal<in
1e300 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20  fo.nPayload ){. 
1e310 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
1e320 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20  ll+info.nSize > 
1e330 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1e340 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
1e350 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
1e360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e370 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
1e380 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1e390 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1e3a0 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
1e3b0 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell+info.nSize
1e3c0 2d 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -4) ){.         
1e3d0 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
1e3e0 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20  l+info.nSize-4, 
1e3f0 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iTo);.          
1e400 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1e410 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e430 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
1e440 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29  (pCell)==iFrom )
1e450 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1e460 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f 29  byte(pCell, iTo)
1e470 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1e480 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
1e490 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1e4a0 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20 29    if( i==nCell )
1e4b0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  {.      if( eTyp
1e4c0 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e!=PTRMAP_BTREE 
1e4d0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67 65  || .          ge
1e4e0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
1e4f0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
1e500 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f 6d  ffset+8])!=iFrom
1e510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1e520 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e530 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1e540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
1e550 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
1e560 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
1e570 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
1e580 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1e590 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e5a0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1e5b0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
1e5c0 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
1e5d0 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
1e5e0 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
1e5f0 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
1e600 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
1e610 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a  ins valid..**.**
1e620 20 54 68 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c   The isCommit fl
1e630 61 67 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  ag indicates tha
1e640 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  t there is no ne
1e650 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
1e660 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  hat.** the journ
1e670 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
1e680 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
1e690 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62  atabase page pDb
1e6a0 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63  Page->pgno .** c
1e6b0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
1e6c0 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
1e6d0 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
1e6e0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
1e6f0 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a  o that.** page..
1e700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
1e710 6c 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74  locatePage(.  Bt
1e720 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
1e730 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
1e740 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44  */.  MemPage *pD
1e750 62 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a  bPage,        /*
1e760 20 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f   Open page to mo
1e770 76 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  ve */.  u8 eType
1e780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e790 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
1e7a0 27 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72  'type' entry for
1e7b0 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1e7c0 6e 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20  no iPtrPage,    
1e7d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1e7e0 72 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20  r map 'page-no' 
1e7f0 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67  entry for pDbPag
1e800 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65  e */.  Pgno iFre
1e810 65 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  ePage,          
1e820 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20  /* The location 
1e830 74 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20  to move pDbPage 
1e840 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  to */.  int isCo
1e850 6d 6d 69 74 20 20 20 20 20 20 20 20 20 20 20 20  mmit            
1e860 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61   /* isCommit fla
1e870 67 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69  g passed to sqli
1e880 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
1e890 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65   */.){.  MemPage
1e8a0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
1e8b0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
1e8c0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
1e8d0 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
1e8e0 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
1e8f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
1e900 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e910 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
1e920 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1e930 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
1e940 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
1e950 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1e960 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
1e970 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1e980 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1e990 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1e9a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1e9b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1e9c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1e9d0 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
1e9e0 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 69  >pBt==pBt );.  i
1e9f0 66 28 20 69 44 62 50 61 67 65 3c 33 20 29 20 72  f( iDbPage<3 ) r
1ea00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1ea10 52 55 50 54 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a  RUPT_BKPT;..  /*
1ea20 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
1ea30 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
1ea40 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
1ea50 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
1ea60 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
1ea70 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
1ea80 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
1ea90 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
1eaa0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
1eab0 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
1eac0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
1ead0 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
1eae0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
1eaf0 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
1eb00 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
1eb10 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1eb20 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
1eb30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eb40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1eb50 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
1eb60 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
1eb70 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
1eb80 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
1eb90 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
1eba0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
1ebb0 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
1ebc0 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
1ebd0 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
1ebe0 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
1ebf0 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
1ec00 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
1ec10 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
1ec20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
1ec30 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
1ec40 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
1ec50 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
1ec60 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
1ec70 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
1ec80 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
1ec90 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
1eca0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
1ecb0 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
1ecc0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1ecd0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
1ece0 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
1ecf0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1ed00 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
1ed10 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1ed20 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
1ed30 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
1ed40 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
1ed50 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
1ed60 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1ed70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ed80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1ed90 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1eda0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
1edb0 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
1edc0 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
1edd0 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
1ede0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1edf0 50 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66  Put(pBt, nextOvf
1ee00 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
1ee10 4f 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20  OW2, iFreePage, 
1ee20 26 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  &rc);.      if( 
1ee30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ee40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ee50 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1ee60 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
1ee70 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
1ee80 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
1ee90 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
1eea0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
1eeb0 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
1eec0 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
1eed0 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
1eee0 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
1eef0 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
1ef00 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
1ef10 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
1ef20 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1ef30 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
1ef40 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
1ef50 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
1ef60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ef70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1ef80 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1ef90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1efa0 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
1efb0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
1efc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1efd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
1efe0 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1eff0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1f000 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1f010 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
1f020 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
1f030 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1f040 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
1f050 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
1f060 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f080 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1f090 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  Bt, iFreePage, e
1f0a0 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20  Type, iPtrPage, 
1f0b0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1f0c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f0d0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1f0e0 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
1f0f0 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
1f100 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
1f110 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1f120 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
1f130 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
1f140 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
1f150 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
1f160 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
1f170 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
1f180 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
1f190 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
1f1a0 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
1f1b0 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
1f1c0 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
1f1d0 6f 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20  ore no point in 
1f1e0 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  .** calling this
1f1f0 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
1f200 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1f210 44 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20  DONE. Or, if an 
1f220 65 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73  error .** occurs
1f230 2c 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74  , return some ot
1f240 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  her error code..
1f250 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69  **.** More speci
1f260 66 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75  fically, this fu
1f270 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
1f280 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
1f290 68 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a  he database so .
1f2a0 2a 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  ** that the last
1f2b0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
1f2c0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
1f2d0 73 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  se is no longer 
1f2e0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  in use..**.** Pa
1f2f0 72 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20  rameter nFin is 
1f300 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
1f310 67 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61  ges that this da
1f320 74 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e  tabase would con
1f330 74 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69  tain.** were thi
1f340 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65  s function calle
1f350 64 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72  d until it retur
1f360 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  ns SQLITE_DONE..
1f370 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f  **.** If the bCo
1f380 6d 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69  mmit parameter i
1f390 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73  s non-zero, this
1f3a0 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
1f3b0 73 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63  s that the .** c
1f3c0 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
1f3d0 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
1f3e0 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69  umStep() until i
1f3f0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1f400 5f 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20  _DONE .** or an 
1f410 65 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69  error. bCommit i
1f420 73 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f  s passed true fo
1f430 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  r an auto-vacuum
1f440 2d 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f  -on-commit .** o
1f450 70 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c  peration, or fal
1f460 73 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d  se for an increm
1f470 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f  ental vacuum..*/
1f480 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72  .static int incr
1f490 56 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61  VacuumStep(BtSha
1f4a0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1f4b0 46 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50  Fin, Pgno iLastP
1f4c0 67 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b  g, int bCommit){
1f4d0 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
1f4e0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
1f4f0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1f500 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
1f510 65 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  e-list */.  int 
1f520 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
1f530 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f540 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1f550 0a 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74  .  assert( iLast
1f560 50 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66  Pg>nFin );..  if
1f570 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45  ( !PTRMAP_ISPAGE
1f580 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26  (pBt, iLastPg) &
1f590 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49  & iLastPg!=PENDI
1f5a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f5b0 29 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70  ) ){.    u8 eTyp
1f5c0 65 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72  e;.    Pgno iPtr
1f5d0 50 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65  Page;..    nFree
1f5e0 4c 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  List = get4byte(
1f5f0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1f600 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66  ata[36]);.    if
1f610 28 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29  ( nFreeList==0 )
1f620 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
1f630 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1f640 7d 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  }..    rc = ptrm
1f650 61 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74  apGet(pBt, iLast
1f660 50 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  Pg, &eType, &iPt
1f670 72 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  rPage);.    if( 
1f680 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f690 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f6b0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1f6c0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  OTPAGE ){.      
1f6d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1f6e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f6f0 7d 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65  }..    if( eType
1f700 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  ==PTRMAP_FREEPAG
1f710 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  E ){.      if( b
1f720 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1f730 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
1f740 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  he page from the
1f750 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74   files free-list
1f760 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65  . This is not re
1f770 71 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a  quired.        *
1f780 2a 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  * if bCommit is 
1f790 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
1f7a0 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
1f7b0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
1f7c0 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
1f7d0 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
1f7e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
1f7f0 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
1f800 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
1f810 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
1f820 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
1f830 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
1f840 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
1f850 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
1f860 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
1f870 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
1f880 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
1f890 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
1f8a0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
1f8b0 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
1f8c0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a  BTALLOC_EXACT);.
1f8d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1f8e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f8f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f900 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f910 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
1f920 65 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a  ePg==iLastPg );.
1f930 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1f940 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1f950 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65      }.    } else
1f960 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46   {.      Pgno iF
1f970 72 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20  reePg;          
1f980 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66     /* Index of f
1f990 72 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ree page to move
1f9a0 20 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20   pLastPg to */. 
1f9b0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c       MemPage *pL
1f9c0 61 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20  astPg;.      u8 
1f9d0 65 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f  eMode = BTALLOC_
1f9e0 41 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70  ANY;   /* Mode p
1f9f0 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c  arameter for all
1fa00 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29  ocateBtreePage()
1fa10 20 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69   */.      Pgno i
1fa20 4e 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Near = 0;       
1fa30 20 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61      /* nearby pa
1fa40 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1fa50 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1fa60 2a 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62  */..      rc = b
1fa70 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1fa80 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
1fa90 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
1faa0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fab0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1fac0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
1fad0 20 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d       /* If bComm
1fae0 69 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  it is zero, this
1faf0 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
1fb00 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
1fb10 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
1fb20 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
1fb30 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
1fb40 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
1fb50 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
1fb60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
1fb70 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
1fb80 61 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20  and, if bCommit 
1fb90 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
1fba0 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a  zero, then keep.
1fbb0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67        ** looping
1fbc0 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61   until a free-pa
1fbd0 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69  ge located withi
1fbe0 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e  n the first nFin
1fbf0 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20   pages.      ** 
1fc00 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66  of the file is f
1fc10 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ound..      */. 
1fc20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74       if( bCommit
1fc30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ==0 ){.        e
1fc40 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c  Mode = BTALLOC_L
1fc50 45 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72  E;.        iNear
1fc60 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d   = nFin;.      }
1fc70 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
1fc80 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1fc90 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1fca0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1fcb0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1fcc0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e  Pg, &iFreePg, iN
1fcd0 65 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20  ear, eMode);.   
1fce0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1fcf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fd00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1fd10 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1fd20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1fd30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fd40 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
1fd50 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
1fd60 69 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20  ile( bCommit && 
1fd70 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
1fd80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
1fd90 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
1fda0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
1fdb0 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
1fdc0 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
1fdd0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
1fde0 46 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29  FreePg, bCommit)
1fdf0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
1fe00 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20  age(pLastPg);.  
1fe10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1fe20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fe30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1fe40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
1fe50 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1fe60 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  ){.    do {.    
1fe70 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20    iLastPg--;.   
1fe80 20 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67   }while( iLastPg
1fe90 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
1fea0 41 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d  AGE(pBt) || PTRM
1feb0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
1fec0 4c 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70  LastPg) );.    p
1fed0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1fee0 3d 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50  = 1;.    pBt->nP
1fef0 61 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20  age = iLastPg;. 
1ff00 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1ff10 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1ff20 54 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65  The database ope
1ff30 6e 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74  ned by the first
1ff40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20   argument is an 
1ff50 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1ff60 62 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61  base.** nOrig pa
1ff70 67 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  ges in size cont
1ff80 61 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65  aining nFree fre
1ff90 65 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20  e pages. Return 
1ffa0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
1ffb0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1ffc0 61 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66  abase in pages f
1ffd0 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f  ollowing an auto
1ffe0 2d 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f  -vacuum operatio
1fff0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  n..*/.static Pgn
20000 6f 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74  o finalDbSize(Bt
20010 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
20020 6f 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46  o nOrig, Pgno nF
20030 72 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74  ree){.  int nEnt
20040 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ry;             
20050 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20060 72 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20  r of entries on 
20070 6f 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20  one ptrmap page 
20080 2a 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61  */.  Pgno nPtrma
20090 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
200a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
200b0 66 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74  f PtrMap pages t
200c0 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
200d0 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20  Pgno nFin;      
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200f0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
20100 2a 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70  */..  nEntry = p
20110 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35  Bt->usableSize/5
20120 3b 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e  ;.  nPtrmap = (n
20130 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
20140 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
20150 72 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e  rig)+nEntry)/nEn
20160 74 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f  try;.  nFin = nO
20170 72 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50  rig - nFree - nP
20180 74 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72  trmap;.  if( nOr
20190 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
201a0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
201b0 6e 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  n<PENDING_BYTE_P
201c0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
201d0 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68  nFin--;.  }.  wh
201e0 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41  ile( PTRMAP_ISPA
201f0 47 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c  GE(pBt, nFin) ||
20200 20 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42   nFin==PENDING_B
20210 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
20220 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
20230 0a 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b  ..  return nFin;
20240 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74  .}../*.** A writ
20250 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  e-transaction mu
20260 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66  st be opened bef
20270 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
20280 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
20290 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67   performs a sing
202a0 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20  le unit of work 
202b0 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65  towards an incre
202c0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a  mental vacuum..*
202d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72  *.** If the incr
202e0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69  emental vacuum i
202f0 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72  s finished after
20300 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68   this function h
20310 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54  as run,.** SQLIT
20320 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e  E_DONE is return
20330 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  ed. If it is not
20340 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e   finished, but n
20350 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  o error occurred
20360 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
20370 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
20380 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
20390 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
203a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
203b0 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
203c0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
203d0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
203e0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
203f0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
20410 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
20420 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
20430 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
20440 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
20450 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
20460 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  m ){.    rc = SQ
20470 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
20480 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72  se{.    Pgno nOr
20490 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
204a0 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67  unt(pBt);.    Pg
204b0 6e 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  no nFree = get4b
204c0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
204d0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
204e0 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69    Pgno nFin = fi
204f0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
20500 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20  Orig, nFree);.. 
20510 20 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69     if( nOrig<nFi
20520 6e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  n ){.      rc = 
20530 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
20540 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  KPT;.    }else i
20550 66 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  f( nFree>0 ){.  
20560 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
20570 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
20580 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
20590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
205a0 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74         invalidat
205b0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
205c0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
205d0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
205e0 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e  tep(pBt, nFin, n
205f0 4f 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Orig, 0);.      
20600 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
20610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20620 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20630 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
20640 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
20650 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
20660 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
20670 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
20680 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
20690 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
206a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
206b0 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ONE;.    }.  }. 
206c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
206d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
206e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
206f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
20700 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c  led prior to sql
20710 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20  ite3PagerCommit 
20720 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
20730 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74  on.** is committ
20740 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ed for an auto-v
20750 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a  acuum database..
20760 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
20770 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
20780 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73  then *pnTrunc is
20790 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
207a0 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74  er of pages.** t
207b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
207c0 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
207d0 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74  ated to during t
207e0 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
207f0 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  s. .** i.e. the 
20800 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65  database has bee
20810 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f  n reorganized so
20820 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66   that only the f
20830 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a  irst *pnTrunc.**
20840 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
20850 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20860 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
20870 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
20880 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20890 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
208a0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
208b0 50 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c  Pager;.  VVA_ONL
208c0 59 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71  Y( int nRef = sq
208d0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
208e0 6e 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20  nt(pPager); ).. 
208f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20900 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
20910 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76  >mutex) );.  inv
20920 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
20930 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
20940 61 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f  assert(pBt->auto
20950 56 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21  Vacuum);.  if( !
20960 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
20970 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  ){.    Pgno nFin
20980 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
20990 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
209a0 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61  database after a
209b0 75 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a  utovacuuming */.
209c0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20      Pgno nFree; 
209d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
209e0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
209f0 20 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61   freelist initia
20a00 6c 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  lly */.    Pgno 
20a10 69 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  iFree;        /*
20a20 20 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74   The next page t
20a30 6f 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20  o be freed */.  
20a40 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
20a50 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
20a60 20 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65   size before fre
20a70 65 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72  eing */..    nOr
20a80 69 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ig = btreePageco
20a90 75 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66  unt(pBt);.    if
20aa0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
20ab0 70 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e  pBt, nOrig) || n
20ac0 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Orig==PENDING_BY
20ad0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
20ae0 20 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e        /* It is n
20af0 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63  ot possible to c
20b00 72 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65  reate a database
20b10 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66   for which the f
20b20 69 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20  inal page.      
20b30 2a 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70  ** is either a p
20b40 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20  ointer-map page 
20b50 6f 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62  or the pending-b
20b60 79 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65  yte page. If one
20b70 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63  .      ** is enc
20b80 6f 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69  ountered, this i
20b90 6e 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74  ndicates corrupt
20ba0 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
20bb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20bc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
20bd0 20 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65      }..    nFree
20be0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
20bf0 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
20c00 33 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d  36]);.    nFin =
20c10 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74   finalDbSize(pBt
20c20 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b  , nOrig, nFree);
20c30 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f  .    if( nFin>nO
20c40 72 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rig ) return SQL
20c50 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
20c60 3b 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e  ;.    if( nFin<n
20c70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63  Orig ){.      rc
20c80 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
20c90 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
20ca0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65    }.    for(iFre
20cb0 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
20cc0 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
20cd0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
20ce0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
20cf0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
20d00 46 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a  Fin, iFree, 1);.
20d10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72      }.    if( (r
20d20 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c  c==SQLITE_DONE |
20d30 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc==SQLITE_OK)
20d40 20 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20   && nFree>0 ){. 
20d50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20d60 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
20d70 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
20d80 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  );.      put4byt
20d90 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
20da0 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20  aData[32], 0);. 
20db0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20dc0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20dd0 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[36], 0);.     
20de0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
20df0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
20e00 5d 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20  ], nFin);.      
20e10 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
20e20 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d   = 1;.      pBt-
20e30 3e 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20  >nPage = nFin;. 
20e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
20e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20e60 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20e70 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
20e80 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
20e90 73 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c  ssert( nRef>=sql
20ea0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
20eb0 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  t(pPager) );.  r
20ec0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
20ed0 73 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c  se /* ifndef SQL
20ee0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
20ef0 55 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20  UUM */.# define 
20f00 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
20f10 78 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e  x) SQLITE_OK.#en
20f20 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
20f30 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
20f40 20 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20   first phase of 
20f50 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
20f60 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  it.  This routin
20f70 65 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f  e.** causes a ro
20f80 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
20f90 6f 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66  o be created (if
20fa0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
20fb0 65 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61  eady exist).** a
20fc0 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
20fd0 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61  h enough informa
20fe0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20  tion so that if 
20ff0 61 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63  a power loss occ
21000 75 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  urs.** the datab
21010 61 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f  ase can be resto
21020 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
21030 6e 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61  nal state by pla
21040 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65  ying back.** the
21050 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20   journal.  Then 
21060 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
21070 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  the journal are 
21080 66 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a  flushed out to.*
21090 2a 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74  * the disk.  Aft
210a0 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  er the journal i
210b0 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64  s safely on oxid
210c0 65 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74  e, the changes t
210d0 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  o the.** databas
210e0 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  e are written in
210f0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
21100 66 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64  file and flushed
21110 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74   to oxide..** At
21120 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73   the end of this
21130 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62   call, the rollb
21140 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c  ack journal stil
21150 6c 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a  l exists on the.
21160 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61  ** disk and we a
21170 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  re still holding
21180 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74   all locks, so t
21190 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
211a0 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74  as not.** commit
211b0 74 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65  ted.  See sqlite
211c0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
211d0 65 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73  eTwo() for the s
211e0 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
211f0 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
21200 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
21210 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
21220 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
21230 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
21240 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
21250 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
21260 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
21270 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
21280 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
21290 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
212a0 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
212b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
212c0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
212d0 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
212e0 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
212f0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
21300 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
21310 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
21320 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
21330 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
21340 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
21350 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
21360 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
21370 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
21380 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
21390 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
213a0 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
213b0 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
213c0 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
213d0 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
213e0 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
213f0 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
21400 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
21410 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
21420 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
21430 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
21440 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
21450 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
21460 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
21470 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
21480 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
21490 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
214a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
214b0 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
214c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
214d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
214e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
214f0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21500 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c   p->pBt;.    sql
21510 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
21520 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
21530 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21540 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
21550 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
21560 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75     rc = autoVacu
21570 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20  umCommit(pBt);. 
21580 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21590 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
215a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
215b0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
215c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
215d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
215e0 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74   pBt->bDoTruncat
215f0 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
21600 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49  e3PagerTruncateI
21610 6d 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72  mage(pBt->pPager
21620 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
21630 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
21640 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21650 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
21660 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61  pBt->pPager, zMa
21670 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71  ster, 0);.    sq
21680 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
21690 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
216a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
216b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
216c0 61 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20  alled from both 
216d0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
216e0 54 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52  Two() and BtreeR
216f0 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20  ollback().** at 
21700 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
21710 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  f a transaction.
21720 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
21730 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
21740 69 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ion(Btree *p){. 
21750 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
21760 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
21770 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
21780 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21790 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
217a0 28 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  (p) );..#ifndef 
217b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
217c0 56 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44  VACUUM.  pBt->bD
217d0 6f 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23  oTruncate = 0;.#
217e0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69  endif.  if( p->i
217f0 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
21800 45 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65  E && db->nVdbeRe
21810 61 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ad>1 ){.    /* I
21820 66 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  f there are othe
21830 72 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65  r active stateme
21840 6e 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  nts that belong 
21850 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
21860 0a 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20  .    ** handle, 
21870 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72  downgrade to a r
21880 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
21890 74 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20  tion. The other 
218a0 73 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a  statements.    *
218b0 2a 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72  * may still be r
218c0 65 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  eading from the 
218d0 64 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20  database.  */.  
218e0 20 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68    downgradeAllSh
218f0 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21900 63 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69  cks(p);.    p->i
21910 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52  nTrans = TRANS_R
21920 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
21930 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64    /* If the hand
21940 6c 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20  le had any kind 
21950 6f 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  of transaction o
21960 70 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74  pen, decrement t
21970 68 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  he .    ** trans
21980 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20  action count of 
21990 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
219a0 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63  . If the transac
219b0 74 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20  tion count .    
219c0 2a 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65  ** reaches 0, se
219d0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
219e0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
219f0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
21a00 65 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20  eIfUnused().    
21a10 2a 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69  ** call below wi
21a20 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  ll unlock the pa
21a30 67 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ger.  */.    if(
21a40 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
21a50 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
21a60 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
21a70 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
21a80 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54  );.      pBt->nT
21a90 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
21aa0 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
21ab0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
21ac0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54          pBt->inT
21ad0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
21ae0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  NS_NONE;.      }
21af0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
21b00 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  et the current t
21b10 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
21b20 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
21b30 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20  nd unlock the . 
21b40 20 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74     ** pager if t
21b50 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20  his call closed 
21b60 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72  the only read or
21b70 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
21b80 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69  on.  */.    p->i
21b90 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
21ba0 4f 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ONE;.    unlockB
21bb0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
21bc0 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49  );.  }..  btreeI
21bd0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a  ntegrity(p);.}..
21be0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
21bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
21c00 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
21c10 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
21c20 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
21c30 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
21c40 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
21c50 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
21c60 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21c70 69 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75  itPhaseOne() rou
21c80 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
21c90 72 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68  rst phase and sh
21ca0 6f 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  ould.** be invok
21cb0 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ed prior to call
21cc0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
21cd0 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74  .  The sqlite3Bt
21ce0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
21cf0 65 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64  e().** routine d
21d00 69 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20  id all the work 
21d10 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72  of writing infor
21d20 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69  mation out to di
21d30 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20  sk and flushing 
21d40 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
21d50 73 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65  so that they are
21d60 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68   written onto th
21d70 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20  e disk platter. 
21d80 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75   All this.** rou
21d90 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69  tine has to do i
21da0 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e  s delete or trun
21db0 63 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65  cate or zero the
21dc0 20 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a   header in the.*
21dd0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  * the rollback j
21de0 6f 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61  ournal (which ca
21df0 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63  uses the transac
21e00 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20  tion to commit) 
21e10 61 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b  and.** drop lock
21e20 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  s..**.** Normall
21e30 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  y, if an error o
21e40 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
21e50 70 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61  pager layer is a
21e60 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a  ttempting to .**
21e70 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e   finalize the un
21e80 64 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  derlying journal
21e90 20 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63   file, this func
21ea0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
21eb0 65 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65  error and.** the
21ec0 20 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c   upper layer wil
21ed0 6c 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c  l attempt a roll
21ee0 62 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69  back. However, i
21ef0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
21f00 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d  ument.** is non-
21f10 7a 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62  zero then this b
21f20 2d 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f  -tree transactio
21f30 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d  n is part of a m
21f40 75 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72  ulti-file .** tr
21f50 61 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68  ansaction. In th
21f60 69 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61  is case, the tra
21f70 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  nsaction has alr
21f80 65 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74  eady been commit
21f90 74 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65  ted .** (by dele
21fa0 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ting a master jo
21fb0 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20  urnal file) and 
21fc0 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
21fd0 69 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20  ignore this .** 
21fe0 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e  functions return
21ff0 20 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20   code. So, even 
22000 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
22010 72 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  rs in the pager 
22020 6c 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20  layer,.** reset 
22030 74 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63  the b-tree objec
22040 74 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74  ts internal stat
22050 65 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68  e to indicate th
22060 61 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20  at the write.** 
22070 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
22080 62 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69  been closed. Thi
22090 73 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c  s is quite safe,
220a0 20 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69   as the pager wi
220b0 6c 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73  ll have.** trans
220c0 69 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65  itioned to the e
220d0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
220e0 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65  * This will rele
220f0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
22100 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
22110 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65  se file.  If the
22120 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74  re.** are no act
22130 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20  ive cursors, it 
22140 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68  also releases th
22150 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a  e read lock..*/.
22160 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
22170 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42  CommitPhaseTwo(B
22180 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c  tree *p, int bCl
22190 65 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70  eanup){..  if( p
221a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
221b0 5f 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53  _NONE ) return S
221c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
221d0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
221e0 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ;.  btreeIntegri
221f0 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ty(p);..  /* If 
22200 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61  the handle has a
22210 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
22220 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20  on open, commit 
22230 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
22240 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  s .  ** transact
22250 69 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20  ion and set the 
22260 73 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20  shared state to 
22270 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f  TRANS_READ..  */
22280 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
22290 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
222a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
222b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
222c0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
222d0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
222e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
222f0 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
22300 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
22310 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
22320 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22330 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
22340 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
22350 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22360 5f 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d  _OK && bCleanup=
22370 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
22380 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
22390 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
223a0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  c;.    }.    p->
223b0 69 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20  iDataVersion--; 
223c0 20 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66   /* Compensate f
223d0 6f 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61  or pPager->iData
223e0 56 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20  Version++; */.  
223f0 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
22400 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
22410 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
22420 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
22430 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
22440 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
22450 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
22460 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
22470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22480 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68  /*.** Do both ph
22490 61 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74  ases of a commit
224a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
224b0 42 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65  BtreeCommit(Btre
224c0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
224d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
224e0 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20  nter(p);.  rc = 
224f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
22500 69 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29  itPhaseOne(p, 0)
22510 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22520 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
22530 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
22540 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20  mmitPhaseTwo(p, 
22550 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
22560 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
22570 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22580 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
22590 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ne sets the stat
225a0 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  e to CURSOR_FAUL
225b0 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a  T and the error.
225c0 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f  ** code to errCo
225d0 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72  de for every cur
225e0 73 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61  sor on any BtSha
225f0 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a  red that pBtree.
22600 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20  ** references.  
22610 4f 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f  Or if the writeO
22620 6e 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20  nly flag is set 
22630 74 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a  to 1, then only.
22640 2a 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75  ** trip write cu
22650 72 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20  rsors and leave 
22660 72 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63  read cursors unc
22670 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76  hanged..**.** Ev
22680 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20  ery cursor is a 
22690 63 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20  candidate to be 
226a0 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69  tripped, includi
226b0 6e 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68  ng cursors.** th
226c0 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68  at belong to oth
226d0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
226e0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70  ections that hap
226f0 70 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61  pen to be.** sha
22700 72 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77  ring the cache w
22710 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a  ith pBtree..**.*
22720 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67  * This routine g
22730 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20  ets called when 
22740 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  a rollback occur
22750 73 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  s. If the writeO
22760 6e 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74  nly.** flag is t
22770 72 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77  rue, then only w
22780 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65  rite-cursors nee
22790 64 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72  d be tripped - r
227a0 65 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73  ead-only.** curs
227b0 6f 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63  ors save their c
227c0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
227d0 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61   so that they ma
227e0 79 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66  y continue .** f
227f0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c  ollowing the rol
22800 6c 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72  lback. Or, if wr
22810 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
22820 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  , all cursors ar
22830 65 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49  e .** tripped. I
22840 6e 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65  n general, write
22850 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66  Only is false if
22860 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22870 20 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64   being.** rolled
22880 20 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74   back modified t
22890 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
228a0 6d 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ma. In this case
228b0 20 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20   b-tree root.** 
228c0 70 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76  pages may be mov
228d0 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72  ed or deleted fr
228e0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
228f0 61 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69  altogether, maki
22900 6e 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20  ng.** it unsafe 
22910 66 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73  for read cursors
22920 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a   to continue..**
22930 0a 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65  .** If the write
22940 4f 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75  Only flag is tru
22950 65 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69  e and an error i
22960 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68  s encountered wh
22970 69 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74  ile .** saving t
22980 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74  he current posit
22990 69 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e  ion of a read-on
229a0 6c 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63  ly cursor, all c
229b0 75 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c  ursors, .** incl
229c0 75 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63  uding all read-c
229d0 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
229e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ed..**.** SQLITE
229f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
22a00 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
22a10 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  r if an error oc
22a20 63 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61  curs while.** sa
22a30 76 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f  ving a cursor po
22a40 73 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74  sition, an SQLit
22a50 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
22a60 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22a70 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
22a80 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69  Btree *pBtree, i
22a90 6e 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20  nt errCode, int 
22aa0 77 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74  writeOnly){.  Bt
22ab0 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74  Cursor *p;.  int
22ac0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
22ad0 0a 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69  ..  assert( (wri
22ae0 74 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69  teOnly==0 || wri
22af0 74 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54  teOnly==1) && BT
22b00 43 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20  CF_WriteFlag==1 
22b10 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20  );.  if( pBtree 
22b20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
22b30 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
22b40 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72  ;.    for(p=pBtr
22b50 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
22b60 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
22b70 7b 0a 20 20 20 20 20 20 69 66 28 20 77 72 69 74  {.      if( writ
22b80 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63 75 72  eOnly && (p->cur
22b90 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72 69  Flags & BTCF_Wri
22ba0 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a 20 20  teFlag)==0 ){.  
22bb0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
22bc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
22bd0 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
22be0 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
22bf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22c00 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  = saveCursorPosi
22c10 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20  tion(p);.       
22c20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22c30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22c40 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65      (void)sqlite
22c50 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
22c60 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72 63 2c  sors(pBtree, rc,
22c70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
22c80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
22c90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22cb0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
22cc0 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20  learCursor(p);. 
22cd0 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65         p->eState
22ce0 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
22cf0 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b 69 70  .        p->skip
22d00 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65 3b 0a  Next = errCode;.
22d10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 74        }.      bt
22d20 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72  reeReleaseAllCur
22d30 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20  sorPages(p);.   
22d40 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
22d50 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
22d60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22d70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  c;.}../*.** Roll
22d80 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
22d90 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73  tion in progress
22da0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43  ..**.** If tripC
22db0 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54  ode is not SQLIT
22dc0 45 5f 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72  E_OK then cursor
22dd0 73 20 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69  s will be invali
22de0 64 61 74 65 64 20 28 74 72 69 70 70 65 64 29 2e  dated (tripped).
22df0 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
22e00 75 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70  ursors are tripp
22e10 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
22e20 69 73 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20  is true but all 
22e30 63 75 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74  cursors are.** t
22e40 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
22e50 6e 6c 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41  nly is false.  A
22e60 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  ny attempt to us
22e70 65 0a 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63  e.** a tripped c
22e80 75 72 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c  ursor will resul
22e90 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
22ea0 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
22eb0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
22ec0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
22ed0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
22ee0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
22ef0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
22f00 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
22f10 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
22f20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
22f30 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
22f40 65 20 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f  e *p, int tripCo
22f50 64 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c  de, int writeOnl
22f60 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  y){.  int rc;.  
22f70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22f80 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
22f90 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73  e *pPage1;..  as
22fa0 73 65 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d  sert( writeOnly=
22fb0 3d 31 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d  =1 || writeOnly=
22fc0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
22fd0 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45  tripCode==SQLITE
22fe0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20  _ABORT_ROLLBACK 
22ff0 7c 7c 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c  || tripCode==SQL
23000 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
23010 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
23020 3b 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65  ;.  if( tripCode
23030 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23040 20 20 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65     rc = tripCode
23050 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
23060 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20  s(pBt, 0, 0);.  
23070 20 20 69 66 28 20 72 63 20 29 20 77 72 69 74 65    if( rc ) write
23080 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Only = 0;.  }els
23090 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
230a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
230b0 20 74 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20   tripCode ){.   
230c0 20 69 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74   int rc2 = sqlit
230d0 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
230e0 72 73 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64  rsors(p, tripCod
230f0 65 2c 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20  e, writeOnly);. 
23100 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
23110 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69  QLITE_OK || (wri
23120 74 65 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32  teOnly==0 && rc2
23130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a  ==SQLITE_OK) );.
23140 20 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c      if( rc2!=SQL
23150 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
23160 32 3b 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e  2;.  }.  btreeIn
23170 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69  tegrity(p);..  i
23180 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
23190 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
231a0 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20    int rc2;..    
231b0 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52  assert( TRANS_WR
231c0 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e  ITE==pBt->inTran
231d0 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72  saction );.    r
231e0 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  c2 = sqlite3Page
231f0 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  rRollback(pBt->p
23200 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
23210 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
23220 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
23230 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
23240 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79  The rollback may
23250 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64 20   have destroyed 
23260 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  the pPage1->aDat
23270 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20  a value.  So.   
23280 20 2a 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65   ** call btreeGe
23290 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20  tPage() on page 
232a0 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a  1 again to make.
232b0 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67      ** sure pPag
232c0 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74  e1->aData is set
232d0 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
232e0 20 20 20 69 66 28 20 62 74 72 65 65 47 65 74 50     if( btreeGetP
232f0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
23300 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
23310 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
23320 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
23330 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (28+(u8*)pPage1-
23340 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74  >aData);.      t
23350 65 73 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d  estcase( nPage==
23360 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 );.      if( n
23370 50 61 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65  Page==0 ) sqlite
23380 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
23390 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
233a0 61 67 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74  age);.      test
233b0 63 61 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65  case( pBt->nPage
233c0 21 3d 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20  !=nPage );.     
233d0 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50   pBt->nPage = nP
233e0 61 67 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  age;.      relea
233f0 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67 65 31  sePageOne(pPage1
23400 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
23410 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64 43  ert( countValidC
23420 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d 3d  ursors(pBt, 1)==
23430 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
23440 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
23450 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
23460 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
23470 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
23480 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
23490 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
234a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
234b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
234c0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
234d0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
234e0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
234f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20 62  ransaction can b
23500 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
23510 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f   independently o
23520 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73  f the main trans
23530 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74  action. You must
23540 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
23550 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20  tion .** before 
23560 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
23570 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
23580 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ubtransaction is
23590 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63   ended automatic
235a0 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65 20  ally .** if the 
235b0 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  main transaction
235c0 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c   commits or roll
235d0 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74  s back..**.** St
235e0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
235f0 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64  actions are used
23600 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75   around individu
23610 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
23620 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f  s.** that are co
23630 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
23640 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20   BEGIN...COMMIT 
23650 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e  block.  If a con
23660 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72  straint.** error
23670 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
23680 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  he statement, th
23690 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61 74  e effect of that
236a0 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   one statement.*
236b0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
236c0 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
236d0 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  ing to rollback 
236e0 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73  the entire trans
236f0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20  action..**.** A 
23700 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74 72  statement sub-tr
23710 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d 70  ansaction is imp
23720 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20 61  lemented as an a
23730 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
23740 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65  nt. The.** value
23750 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23760 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
23770 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  is the total num
23780 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74  ber of savepoint
23790 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  s,.** including 
237a0 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75  the new anonymou
237b0 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65  s savepoint, ope
237c0 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65 2e  n on the B-Tree.
237d0 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a 2a   i.e. if there.*
237e0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
237f0 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e  savepoints and n
23800 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e  o other statemen
23810 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f  t-transactions o
23820 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65  pen,.** iStateme
23830 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61 6e  nt is 1. This an
23840 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e  onymous savepoin
23850 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65  t can be release
23860 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
23870 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71  .** using the sq
23880 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
23890 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  int() function..
238a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
238b0 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74 72  reeBeginStmt(Btr
238c0 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61 74  ee *p, int iStat
238d0 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  ement){.  int rc
238e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
238f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71  t = p->pBt;.  sq
23900 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
23910 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
23920 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
23930 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
23940 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
23950 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
23960 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Y)==0 );.  asser
23970 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20  t( iStatement>0 
23980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74  );.  assert( iSt
23990 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e  atement>p->db->n
239a0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 61  Savepoint );.  a
239b0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
239c0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
239d0 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20 41  _WRITE );.  /* A
239e0 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76 65  t the pager leve
239f0 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  l, a statement t
23a00 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20  ransaction is a 
23a10 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20  savepoint with. 
23a20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
23a30 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
23a40 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
23a50 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
23a60 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  g.  ** SQL state
23a70 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c 6c  ments. It is ill
23a80 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72 65  egal to open, re
23a90 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
23aa0 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  k any.  ** such 
23ab0 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c 65  savepoints while
23ac0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
23ad0 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65 70  ransaction savep
23ae0 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e 0a  oint is active..
23af0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
23b00 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
23b10 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
23b20 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b 0a  r, iStatement);.
23b30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
23b40 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
23b50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23b60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
23b70 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
23b80 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61 79  on, op, is alway
23b90 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
23ba0 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45 50  BACK.** or SAVEP
23bb0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54 68  OINT_RELEASE. Th
23bc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74 68  is function eith
23bd0 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20 72  er releases or r
23be0 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a 2a  olls back the.**
23bf0 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e 74   savepoint ident
23c00 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
23c10 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20 64  er iSavepoint, d
23c20 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20  epending on the 
23c30 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e  value .** of op.
23c40 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c  .**.** Normally,
23c50 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67   iSavepoint is g
23c60 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
23c70 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48 6f  qual to zero. Ho
23c80 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73 0a  wever, if op is.
23c90 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ** SAVEPOINT_ROL
23ca0 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61 76  LBACK, then iSav
23cb0 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f 20  epoint may also 
23cc0 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20 63  be -1. In this c
23cd0 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74  ase the .** cont
23ce0 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74 69  ents of the enti
23cf0 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  re transaction a
23d00 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  re rolled back. 
23d10 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
23d20 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72 6d  t.** from a norm
23d30 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  al transaction r
23d40 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20 6c  ollback, as no l
23d50 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73 65  ocks are release
23d60 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72 61  d and the.** tra
23d70 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e 73  nsaction remains
23d80 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71   open..*/.int sq
23d90 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
23da0 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  int(Btree *p, in
23db0 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70  t op, int iSavep
23dc0 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
23dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
23de0 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72 61  f( p && p->inTra
23df0 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
23e00 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
23e10 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
23e20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 53     assert( op==S
23e30 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
23e40 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e   || op==SAVEPOIN
23e50 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20 20  T_ROLLBACK );.  
23e60 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65 70    assert( iSavep
23e70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61 76  oint>=0 || (iSav
23e80 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f 70  epoint==-1 && op
23e90 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
23ea0 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71 6c  BACK) );.    sql
23eb0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23ec0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
23ed0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23ee0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
23ef0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
23f00 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
23f10 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23f20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23f30 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23f40 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
23f50 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
23f60 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
23f70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23f80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
23f90 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30 20 26  ( iSavepoint<0 &
23fa0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
23fb0 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59   & BTS_INITIALLY
23fc0 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a 20 20  _EMPTY)!=0 ){.  
23fd0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
23fe0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
23ff0 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61      rc = newData
24000 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20  base(pBt);.     
24010 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 67 65   pBt->nPage = ge
24020 74 34 62 79 74 65 28 32 38 20 2b 20 70 42 74 2d  t4byte(28 + pBt-
24030 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  >pPage1->aData);
24040 0a 0a 20 20 20 20 20 20 2f 2a 20 70 42 74 2d 3e  ..      /* pBt->
24050 6e 50 61 67 65 20 6d 69 67 68 74 20 62 65 20 7a  nPage might be z
24060 65 72 6f 20 69 66 20 74 68 65 20 64 61 74 61 62  ero if the datab
24070 61 73 65 20 77 61 73 20 63 6f 72 72 75 70 74 20  ase was corrupt 
24080 77 68 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 74  when .      ** t
24090 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
240a0 61 73 20 73 74 61 72 74 65 64 2e 20 4f 74 68 65  as started. Othe
240b0 72 77 69 73 65 2c 20 69 74 20 6d 75 73 74 20 62  rwise, it must b
240c0 65 20 61 74 20 6c 65 61 73 74 20 31 2e 20 20 2a  e at least 1.  *
240d0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
240e0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 42  CORRUPT_DB || pB
240f0 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a 20 20  t->nPage>0 );.  
24100 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
24110 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
24120 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
24130 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
24140 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
24150 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
24160 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
24170 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 49  age.** iTable. I
24180 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63 75  f a read-only cu
24190 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65  rsor is requeste
241a0 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  d, it is assumed
241b0 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 61 6c   that.** the cal
241c0 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61 73 20  ler already has 
241d0 61 74 20 6c 65 61 73 74 20 61 20 72 65 61 64 2d  at least a read-
241e0 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
241f0 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20   open.** on the 
24200 64 61 74 61 62 61 73 65 20 61 6c 72 65 61 64 79  database already
24210 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63 75 72  . If a write-cur
24220 73 6f 72 20 69 73 20 72 65 71 75 65 73 74 65 64  sor is requested
24230 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 61  , then.** the ca
24240 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65 64 20  ller is assumed 
24250 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65 6e 20  to have an open 
24260 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
24270 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
24280 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
24290 6f 66 20 77 72 46 6c 61 67 20 69 73 20 63 6c 65  of wrFlag is cle
242a0 61 72 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ar, then the cur
242b0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20  sor can only.** 
242c0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
242d0 69 6e 67 2e 20 20 49 66 20 74 68 65 20 42 54 52  ing.  If the BTR
242e0 45 45 5f 57 52 43 53 52 20 62 69 74 20 69 73 20  EE_WRCSR bit is 
242f0 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  set, then the cu
24300 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62 65 20 75  rsor.** can be u
24310 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
24320 6f 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 69  or for writing i
24330 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
24340 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a  ns for writing.*
24350 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  * are also met. 
24360 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
24370 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
24380 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
24390 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72 69 74 69  der.** for writi
243a0 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f 77 65 64  ng to be allowed
243b0 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
243c0 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
243d0 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
243e0 68 20 77 72 46 6c 61 67 20 63 6f 6e 74 61 69 6e  h wrFlag contain
243f0 69 6e 67 20 42 54 52 45 45 5f 57 52 43 53 52 0a  ing BTREE_WRCSR.
24400 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
24410 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
24420 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
24430 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
24440 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
24450 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
24460 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
24470 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
24480 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
24490 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
244a0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
244b0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
244c0 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
244d0 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
244e0 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
244f0 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
24500 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
24510 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
24520 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
24530 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
24540 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
24550 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
24560 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
24570 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
24580 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
24590 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
245a0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
245b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42  ion..**.** The B
245c0 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45 20 62  TREE_FORDELETE b
245d0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 6d 61 79  it of wrFlag may
245e0 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 20 73   optionally be s
245f0 65 74 20 69 66 20 42 54 52 45 45 5f 57 52 43 53  et if BTREE_WRCS
24600 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20 20 49 66  R.** is set.  If
24610 20 46 4f 52 44 45 4c 45 54 45 20 69 73 20 73 65   FORDELETE is se
24620 74 2c 20 74 68 61 74 20 69 73 20 61 20 68 69 6e  t, that is a hin
24630 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
24640 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
24650 74 68 69 73 20 63 75 72 73 6f 72 20 77 69 6c 6c  this cursor will
24660 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 74 6f   only be used to
24670 20 73 65 65 6b 20 74 6f 20 61 6e 64 20 64 65 6c   seek to and del
24680 65 74 65 20 65 6e 74 72 69 65 73 20 6f 66 20 61  ete entries of a
24690 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 70 61  n index.** as pa
246a0 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 44  rt of a larger D
246b0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2e  ELETE statement.
246c0 20 20 54 68 65 20 46 4f 52 44 45 4c 45 54 45 20    The FORDELETE 
246d0 68 69 6e 74 20 69 73 20 6e 6f 74 20 75 73 65 64  hint is not used
246e0 20 62 79 0a 2a 2a 20 74 68 69 73 20 69 6d 70 6c   by.** this impl
246f0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 42 75 74  ementation.  But
24700 20 69 6e 20 61 20 68 79 70 6f 74 68 65 74 69 63   in a hypothetic
24710 61 6c 20 61 6c 74 65 72 6e 61 74 69 76 65 20 73  al alternative s
24720 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 0a 2a  torage engine .*
24730 2a 20 69 6e 20 77 68 69 63 68 20 69 6e 64 65 78  * in which index
24740 20 65 6e 74 72 69 65 73 20 61 72 65 20 61 75 74   entries are aut
24750 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
24760 65 64 20 77 68 65 6e 20 63 6f 72 72 65 73 70 6f  ed when correspo
24770 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a 2a 20 72  nding table.** r
24780 6f 77 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c  ows are deleted,
24790 20 74 68 65 20 46 4f 52 44 45 4c 45 54 45 20 66   the FORDELETE f
247a0 6c 61 67 20 69 73 20 61 20 68 69 6e 74 20 74 68  lag is a hint th
247b0 61 74 20 61 6c 6c 20 53 45 45 4b 20 61 6e 64 20  at all SEEK and 
247c0 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65 72 61 74  DELETE.** operat
247d0 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20 63 75 72  ions on this cur
247e0 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f 2d 6f 70  sor can be no-op
247f0 73 20 61 6e 64 20 61 6c 6c 20 52 45 41 44 20 6f  s and all READ o
24800 70 65 72 61 74 69 6f 6e 73 20 63 61 6e 20 0a 2a  perations can .*
24810 2a 20 72 65 74 75 72 6e 20 61 20 6e 75 6c 6c 20  * return a null 
24820 72 6f 77 20 28 32 2d 62 79 74 65 73 3a 20 30 78  row (2-bytes: 0x
24830 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20  01 0x00)..**.** 
24840 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  No checking is d
24850 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  one to make sure
24860 20 74 68 61 74 20 70 61 67 65 20 69 54 61 62 6c   that page iTabl
24870 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a  e really is the.
24880 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  ** root page of 
24890 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74  a b-tree.  If it
248a0 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68   is not, then th
248b0 65 20 63 75 72 73 6f 72 20 61 63 71 75 69 72 65  e cursor acquire
248c0 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f  d.** will not wo
248d0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a  rk correctly..**
248e0 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d 65  .** It is assume
248f0 64 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  d that the sqlit
24900 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72  e3BtreeCursorZer
24910 6f 28 29 20 68 61 73 20 62 65 65 6e 20 63 61 6c  o() has been cal
24920 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75 72 20 74  led.** on pCur t
24930 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
24940 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 70 72   memory space pr
24950 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20  ior to invoking 
24960 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  this routine..*/
24970 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
24980 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
24990 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249b0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
249c0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
249f0 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65  ot page of table
24a00 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
24a10 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20  t wrFlag,       
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69       /* 1 to wri
24a40 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20  te. 0 read-only 
24a50 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49  */.  struct KeyI
24a60 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
24a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24a80 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70  irst arg to comp
24a90 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
24aa0 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
24ab0 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20  Cur             
24ac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24ad0 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72  pace for new cur
24ae0 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  sor */.){.  BtSh
24af0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24b00 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt;             
24b10 20 20 20 2f 2a 20 53 68 61 72 65 64 20 62 2d 74     /* Shared b-t
24b20 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ree handle */.  
24b30 42 74 43 75 72 73 6f 72 20 2a 70 58 3b 20 20 20  BtCursor *pX;   
24b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e         /* Loopin
24b60 67 20 6f 76 65 72 20 6f 74 68 65 72 20 61 6c 6c  g over other all
24b70 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a 20 20 61   cursors */..  a
24b80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
24b90 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
24ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77 72   );.  assert( wr
24bb0 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20 20 20 20  Flag==0 .       
24bc0 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54 52 45 45  || wrFlag==BTREE
24bd0 5f 57 52 43 53 52 20 0a 20 20 20 20 20 20 20 7c  _WRCSR .       |
24be0 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54 52 45 45  | wrFlag==(BTREE
24bf0 5f 57 52 43 53 52 7c 42 54 52 45 45 5f 46 4f 52  _WRCSR|BTREE_FOR
24c00 44 45 4c 45 54 45 29 20 0a 20 20 29 3b 0a 0a 20  DELETE) .  );.. 
24c10 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
24c20 67 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  g assert stateme
24c30 6e 74 73 20 76 65 72 69 66 79 20 74 68 61 74 20  nts verify that 
24c40 69 66 20 74 68 69 73 20 69 73 20 61 20 73 68 61  if this is a sha
24c50 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62 2d 74 72  rable .  ** b-tr
24c60 65 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ee database, the
24c70 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68   connection is h
24c80 6f 6c 64 69 6e 67 20 74 68 65 20 72 65 71 75 69  olding the requi
24c90 72 65 64 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2c  red table locks,
24ca0 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68 61 74 20   .  ** and that 
24cb0 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  no other connect
24cc0 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f 70 65 6e  ion has any open
24cd0 20 63 75 72 73 6f 72 20 74 68 61 74 20 63 6f 6e   cursor that con
24ce0 66 6c 69 63 74 73 20 77 69 74 68 20 0a 20 20 2a  flicts with .  *
24cf0 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f  * this lock.  */
24d00 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68  .  assert( hasSh
24d10 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
24d20 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c 20 70 4b  ck(p, iTable, pK
24d30 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77 72 46 6c  eyInfo!=0, (wrFl
24d40 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20 20 61 73  ag?2:1)) );.  as
24d50 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24d60 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
24d70 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
24d80 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
24d90 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
24da0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
24db0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
24dc0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
24dd0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
24de0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
24df0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
24e00 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
24e10 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
24e20 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
24e30 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
24e40 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
24e50 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
24e60 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
24e70 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
24e80 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
24e90 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
24ea0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
24eb0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
24ec0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
24ed0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
24ee0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
24ef0 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20    if( iTable==1 
24f00 26 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  && btreePagecoun
24f10 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20  t(pBt)==0 ){.   
24f20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
24f30 3d 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65  =0 );.    iTable
24f40 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
24f50 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  Now that no othe
24f60 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63  r errors can occ
24f70 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69  ur, finish filli
24f80 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73  ng in the BtCurs
24f90 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65  or.  ** variable
24fa0 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63  s and link the c
24fb0 75 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42  ursor into the B
24fc0 74 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a  tShared list.  *
24fd0 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  /.  pCur->pgnoRo
24fe0 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c  ot = (Pgno)iTabl
24ff0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  e;.  pCur->iPage
25000 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70   = -1;.  pCur->p
25010 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
25020 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72  fo;.  pCur->pBtr
25030 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e  ee = p;.  pCur->
25040 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75  pBt = pBt;.  pCu
25050 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72  r->curFlags = wr
25060 46 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74  Flag ? BTCF_Writ
25070 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75  eFlag : 0;.  pCu
25080 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73  r->curPagerFlags
25090 20 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20   = wrFlag ? 0 : 
250a0 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
250b0 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  LY;.  /* If ther
250c0 65 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72  e are two or mor
250d0 65 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  e cursors on the
250e0 20 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65   same btree, the
250f0 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20  n all such.  ** 
25100 63 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68  cursors *must* h
25110 61 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  ave the BTCF_Mul
25120 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20  tiple flag set. 
25130 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d  */.  for(pX=pBt-
25140 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58  >pCursor; pX; pX
25150 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
25160 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f   if( pX->pgnoRoo
25170 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20  t==(Pgno)iTable 
25180 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72  ){.      pX->cur
25190 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75  Flags |= BTCF_Mu
251a0 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43  ltiple;.      pC
251b0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
251c0 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
251d0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d     }.  }.  pCur-
251e0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
251f0 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43  ursor;.  pBt->pC
25200 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
25210 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
25220 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
25230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25240 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  K;.}.int sqlite3
25250 42 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  BtreeCursor(.  B
25260 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25290 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74  e btree */.  int
252a0 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20   iTable,        
252b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252c0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
252d0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
252e0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
252f0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
25320 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
25330 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
25340 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
25350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25360 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
25370 20 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a   to xCompare() *
25380 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  /.  BtCursor *pC
25390 75 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ur              
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 2f 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72  /* Write new cur
253c0 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  sor here */.){. 
253d0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
253e0 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72  Table<1 ){.    r
253f0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
25400 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65  PT_BKPT;.  }else
25410 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
25420 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
25430 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72  rc = btreeCursor
25440 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c  (p, iTable, wrFl
25450 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43  ag, pKeyInfo, pC
25460 75 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ur);.    sqlite3
25470 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
25480 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
25490 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
254a0 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74  the size of a Bt
254b0 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e  Cursor object in
254c0 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   bytes..**.** Th
254d0 69 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73  is interfaces is
254e0 20 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20   needed so that 
254f0 75 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73  users of cursors
25500 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65   can preallocate
25510 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73  .** sufficient s
25520 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61  torage to hold a
25530 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74   cursor.  The Bt
25540 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73  Cursor object is
25550 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73   opaque.** to us
25560 65 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e  ers so they cann
25570 6f 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66  ot do the sizeof
25580 28 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20  () themselves - 
25590 74 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a  they must call.*
255a0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
255b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
255c0 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f  reeCursorSize(vo
255d0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f  id){.  return RO
255e0 55 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75  UND8(sizeof(BtCu
255f0 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rsor));.}../*.**
25600 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f   Initialize memo
25610 72 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ry that will be 
25620 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
25630 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
25640 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70  ..**.** The simp
25650 6c 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65  le approach here
25660 20 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d   would be to mem
25670 73 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65  set() the entire
25680 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65   object.** to ze
25690 72 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e  ro.  But it turn
256a0 73 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61  s out that the a
256b0 70 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64  pPage[] and aiId
256c0 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f  x[] arrays.** do
256d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
256e0 7a 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20  zeroed and they 
256f0 61 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65  are large, so we
25700 20 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a   can save a lot.
25710 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62  ** of run-time b
25720 79 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69  y skipping the i
25730 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66  nitialization of
25740 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e   those elements.
25750 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
25760 42 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28  BtreeCursorZero(
25770 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  BtCursor *p){.  
25780 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66  memset(p, 0, off
25790 73 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20  setof(BtCursor, 
257a0 42 54 43 55 52 53 4f 52 5f 46 49 52 53 54 5f 55  BTCURSOR_FIRST_U
257b0 4e 49 4e 49 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  NINIT));.}../*.*
257c0 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
257d0 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
257e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
257f0 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
25800 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
25810 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
25820 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
25830 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
25840 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
25850 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
25860 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
25870 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
25880 65 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  e ){.    BtShare
25890 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
258a0 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
258b0 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
258c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
258d0 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20 29  Bt->pCursor!=0 )
258e0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
258f0 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a  Cursor==pCur ){.
25900 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73        pBt->pCurs
25910 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  or = pCur->pNext
25920 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25930 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50 72     BtCursor *pPr
25940 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  ev = pBt->pCurso
25950 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  r;.      do{.   
25960 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d 3e       if( pPrev->
25970 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20  pNext==pCur ){. 
25980 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d 3e           pPrev->
25990 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e  pNext = pCur->pN
259a0 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ext;.          b
259b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
259c0 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d 20          pPrev = 
259d0 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20  pPrev->pNext;.  
259e0 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57 41      }while( ALWA
259f0 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20 20  YS(pPrev) );.   
25a00 20 7d 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65   }.    btreeRele
25a10 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
25a20 73 28 70 43 75 72 29 3b 0a 20 20 20 20 75 6e 6c  s(pCur);.    unl
25a30 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
25a40 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
25a50 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f  e3_free(pCur->aO
25a60 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 73 71  verflow);.    sq
25a70 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
25a80 3e 70 4b 65 79 29 3b 0a 20 20 20 20 73 71 6c 69  >pKey);.    sqli
25a90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
25aa0 74 72 65 65 29 3b 0a 20 20 20 20 70 43 75 72 2d  tree);.    pCur-
25ab0 3e 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d  >pBtree = 0;.  }
25ac0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25ad0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
25ae0 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
25af0 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
25b00 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
25b10 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
25b20 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
25b30 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
25b40 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
25b50 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61   call.** btreePa
25b60 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c  rseCell() to fil
25b70 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42  l it in..**.** B
25b80 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20  tCursor.info is 
25b90 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20 69  a cache of the i
25ba0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
25bb0 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a  e current cell..
25bc0 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63 61  ** Using this ca
25bd0 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65 20  che reduces the 
25be0 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20  number of calls 
25bf0 74 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  to btreeParseCel
25c00 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  l()..*/.#ifndef 
25c10 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
25c20 69 6e 74 20 63 65 6c 6c 49 6e 66 6f 45 71 75 61  int cellInfoEqua
25c30 6c 28 43 65 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43  l(CellInfo *a, C
25c40 65 6c 6c 49 6e 66 6f 20 2a 62 29 7b 0a 20 20 20  ellInfo *b){.   
25c50 20 69 66 28 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d   if( a->nKey!=b-
25c60 3e 6e 4b 65 79 20 29 20 72 65 74 75 72 6e 20 30  >nKey ) return 0
25c70 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e 70 50 61  ;.    if( a->pPa
25c80 79 6c 6f 61 64 21 3d 62 2d 3e 70 50 61 79 6c 6f  yload!=b->pPaylo
25c90 61 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ad ) return 0;. 
25ca0 20 20 20 69 66 28 20 61 2d 3e 6e 50 61 79 6c 6f     if( a->nPaylo
25cb0 61 64 21 3d 62 2d 3e 6e 50 61 79 6c 6f 61 64 20  ad!=b->nPayload 
25cc0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25cd0 69 66 28 20 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62  if( a->nLocal!=b
25ce0 2d 3e 6e 4c 6f 63 61 6c 20 29 20 72 65 74 75 72  ->nLocal ) retur
25cf0 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 61 2d 3e  n 0;.    if( a->
25d00 6e 53 69 7a 65 21 3d 62 2d 3e 6e 53 69 7a 65 20  nSize!=b->nSize 
25d10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
25d20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
25d30 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
25d40 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72  rtCellInfo(BtCur
25d50 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20  sor *pCur){.    
25d60 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
25d70 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c     memset(&info,
25d80 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29   0, sizeof(info)
25d90 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  );.    btreePars
25da0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
25db0 65 2c 20 70 43 75 72 2d 3e 69 78 2c 20 26 69 6e  e, pCur->ix, &in
25dc0 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  fo);.    assert(
25dd0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 63   CORRUPT_DB || c
25de0 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 26 69 6e  ellInfoEqual(&in
25df0 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  fo, &pCur->info)
25e00 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
25e10 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
25e20 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
25e30 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
25e40 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
25e50 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
25e60 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
25e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
25e80 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  ==0 ){.    pCur-
25e90 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25ea0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
25eb0 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
25ec0 70 43 75 72 2d 3e 70 50 61 67 65 2c 70 43 75 72  pCur->pPage,pCur
25ed0 2d 3e 69 78 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  ->ix,&pCur->info
25ee0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
25ef0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
25f00 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  Cur);.  }.}..#if
25f10 6e 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20  ndef NDEBUG  /* 
25f20 54 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65  The next routine
25f30 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69   used only withi
25f40 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
25f50 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52  ments */./*.** R
25f60 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
25f70 65 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72  e given BtCursor
25f80 20 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61   is valid.  A va
25f90 6c 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e  lid cursor is on
25fa0 65 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72  e.** that is cur
25fb0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
25fc0 74 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e  to a row in a (n
25fd0 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e  on-empty) table.
25fe0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65  .** This is a ve
25ff0 72 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69  rification routi
26000 6e 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  ne is used only 
26010 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20  within assert() 
26020 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69  statements..*/.i
26030 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
26040 75 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43  ursorIsValid(BtC
26050 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
26060 72 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70  return pCur && p
26070 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
26080 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e  SOR_VALID;.}.#en
26090 64 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  dif /* NDEBUG */
260a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
260b0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 4e 4e  eCursorIsValidNN
260c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
260d0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  {.  assert( pCur
260e0 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
260f0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26100 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f  RSOR_VALID;.}../
26110 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
26120 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
26130 65 67 65 72 20 6b 65 79 20 6f 72 20 22 72 6f 77  eger key or "row
26140 69 64 22 20 66 6f 72 20 61 20 74 61 62 6c 65 20  id" for a table 
26150 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69 73 20 72  btree..** This r
26160 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 76  outine is only v
26170 61 6c 69 64 20 66 6f 72 20 61 20 63 75 72 73 6f  alid for a curso
26180 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
26190 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64  ng into a.** ord
261a0 69 6e 61 72 79 20 74 61 62 6c 65 20 62 74 72 65  inary table btre
261b0 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  e.  If the curso
261c0 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 69  r points to an i
261d0 6e 64 65 78 20 62 74 72 65 65 20 6f 72 0a 2a 2a  ndex btree or.**
261e0 20 69 73 20 69 6e 76 61 6c 69 64 2c 20 74 68 65   is invalid, the
261f0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20   result of this 
26200 72 6f 75 74 69 6e 65 20 69 73 20 75 6e 64 65 66  routine is undef
26210 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  ined..*/.i64 sql
26220 69 74 65 33 42 74 72 65 65 49 6e 74 65 67 65 72  ite3BtreeInteger
26230 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
26240 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
26250 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
26260 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
26270 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
26280 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
26290 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
262a0 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20  >curIntKey );.  
262b0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
262c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
262d0 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a  ->info.nKey;.}..
262e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
262f0 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f  ABLE_OFFSET_SQL_
26300 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  FUNC./*.** Retur
26310 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
26320 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
26330 69 6c 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ile for the star
26340 74 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61 79 6c  t of the.** payl
26350 6f 61 64 20 74 6f 20 77 68 69 63 68 20 74 68 65  oad to which the
26360 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
26370 69 6e 67 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69  ing..*/.i64 sqli
26380 74 65 33 42 74 72 65 65 4f 66 66 73 65 74 28 42  te3BtreeOffset(B
26390 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
263a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
263b0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
263c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
263d0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
263e0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65  OR_VALID );.  ge
263f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
26400 0a 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 70  .  return (i64)p
26410 43 75 72 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  Cur->pBt->pageSi
26420 7a 65 2a 28 28 69 36 34 29 70 43 75 72 2d 3e 70  ze*((i64)pCur->p
26430 50 61 67 65 2d 3e 70 67 6e 6f 20 2d 20 31 29 20  Page->pgno - 1) 
26440 2b 0a 20 20 20 20 20 20 20 20 20 28 69 36 34 29  +.         (i64)
26450 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  (pCur->info.pPay
26460 6c 6f 61 64 20 2d 20 70 43 75 72 2d 3e 70 50 61  load - pCur->pPa
26470 67 65 2d 3e 61 44 61 74 61 29 3b 0a 7d 0a 23 65  ge->aData);.}.#e
26480 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
26490 4e 41 42 4c 45 5f 4f 46 46 53 45 54 5f 53 51 4c  NABLE_OFFSET_SQL
264a0 5f 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _FUNC */../*.** 
264b0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
264c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
264d0 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
264e0 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
264f0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
26500 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
26510 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
26520 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
26530 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
26540 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
26550 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
26560 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
26570 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
26580 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
26590 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
265a0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
265b0 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
265c0 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
265d0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
265e0 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
265f0 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
26600 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
26610 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
26620 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
26630 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
26640 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
26650 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
26660 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
26670 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
26680 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
26690 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
266a0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
266b0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
266c0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
266d0 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
266e0 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
266f0 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 75 70 70  ** Return an upp
26700 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  er bound on the 
26710 73 69 7a 65 20 6f 66 20 61 6e 79 20 72 65 63 6f  size of any reco
26720 72 64 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  rd for the table
26730 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72  .** that the cur
26740 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
26750 69 6e 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  into..**.** This
26760 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74   is an optimizat
26770 69 6f 6e 2e 20 20 45 76 65 72 79 74 68 69 6e 67  ion.  Everything
26780 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
26790 20 69 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   if this.** rout
267a0 69 6e 65 20 61 6c 77 61 79 73 20 72 65 74 75 72  ine always retur
267b0 6e 73 20 32 31 34 37 34 38 33 36 34 37 20 28 77  ns 2147483647 (w
267c0 68 69 63 68 20 69 73 20 74 68 65 20 6c 61 72 67  hich is the larg
267d0 65 73 74 20 72 65 63 6f 72 64 0a 2a 2a 20 74 68  est record.** th
267e0 61 74 20 53 51 4c 69 74 65 20 63 61 6e 20 68 61  at SQLite can ha
267f0 6e 64 6c 65 29 20 6f 72 20 6d 6f 72 65 2e 20 20  ndle) or more.  
26800 42 75 74 20 72 65 74 75 72 6e 69 6e 67 20 61 20  But returning a 
26810 73 6d 61 6c 6c 65 72 20 76 61 6c 75 65 20 6d 69  smaller value mi
26820 67 68 74 0a 2a 2a 20 70 72 65 76 65 6e 74 20 6c  ght.** prevent l
26830 61 72 67 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  arge memory allo
26840 63 61 74 69 6f 6e 73 20 77 68 65 6e 20 74 72 79  cations when try
26850 69 6e 67 20 74 6f 20 69 6e 74 65 72 70 72 65 74  ing to interpret
26860 20 61 0a 2a 2a 20 63 6f 72 72 75 70 74 20 64 61   a.** corrupt da
26870 74 72 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  trabase..**.** T
26880 68 65 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65  he current imple
26890 6d 65 6e 74 61 74 69 6f 6e 20 6d 65 72 65 6c 79  mentation merely
268a0 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 69 7a   returns the siz
268b0 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79  e of the underly
268c0 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
268d0 66 69 6c 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  file..*/.sqlite3
268e0 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 42 74  _int64 sqlite3Bt
268f0 72 65 65 4d 61 78 52 65 63 6f 72 64 53 69 7a 65  reeMaxRecordSize
26900 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
26910 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
26920 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
26930 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
26940 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
26950 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
26960 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74  return pCur->pBt
26970 2d 3e 70 61 67 65 53 69 7a 65 20 2a 20 28 73 71  ->pageSize * (sq
26980 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 43 75 72  lite3_int64)pCur
26990 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a  ->pBt->nPage;.}.
269a0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
269b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
269c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
269d0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
269e0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
269f0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
26a00 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
26a10 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
26a20 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
26a30 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
26a40 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
26a50 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
26a60 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
26a70 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
26a80 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
26a90 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
26aa0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26ab0 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
26ac0 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
26ad0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
26ae0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
26af0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
26b00 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
26b10 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
26b20 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
26b30 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
26b40 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
26b50 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
26b60 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
26b70 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
26b80 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
26b90 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
26ba0 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
26bb0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
26bc0 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
26bd0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
26be0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
26bf0 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
26c00 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
26c10 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
26c20 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
26c30 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
26c40 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
26c50 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
26c60 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
26c70 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
26c80 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
26c90 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
26ca0 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
26cb0 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
26cc0 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
26cd0 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
26ce0 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
26cf0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
26d00 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
26d10 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
26d20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
26d30 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
26d40 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
26d50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
26d60 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
26d70 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26d90 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
26da0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
26db0 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
26dc0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
26dd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
26de0 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
26df0 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
26e00 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
26e10 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
26e20 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
26e30 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
26e40 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
26e50 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
26e60 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
26e70 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
26e80 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
26e90 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
26ea0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
26eb0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
26ec0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26ed0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
26ee0 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
26ef0 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
26f00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26f10 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
26f20 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
26f30 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
26f40 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
26f50 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
26f60 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
26f70 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
26f80 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
26f90 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
26fa0 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
26fb0 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
26fc0 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
26fd0 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
26fe0 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
26ff0 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
27000 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
27010 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
27020 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
27030 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
27040 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
27050 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
27060 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
27070 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
27080 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
27090 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
270a0 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
270b0 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
270c0 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
270d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
270e0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
270f0 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
27100 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
27110 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
27120 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
27130 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
27140 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
27150 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
27160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27170 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
27180 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
27190 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
271a0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
271b0 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
271c0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
271d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
271e0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
271f0 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
27200 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
27210 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
27230 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
27240 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
27250 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
27260 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
27270 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
27280 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
27290 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
272a0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
272b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
272c0 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
272d0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
272e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
272f0 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
27300 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
27310 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
27320 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
27330 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
27340 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
27350 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
27360 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
27370 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
27380 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
27390 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
273a0 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
273b0 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
273c0 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
273d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
273e0 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
273f0 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
27400 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
27410 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
27420 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
27430 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
27440 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
27450 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
27460 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
27470 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
27480 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
27490 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
274a0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
274b0 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
274c0 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
274d0 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
274e0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
274f0 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
27500 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
27510 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
27520 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
27530 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
27540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27550 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
27560 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
27570 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
27580 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
27590 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
275a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
275b0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
275c0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
275d0 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
275e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
275f0 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
27600 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
27610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27620 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
27630 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
27640 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
27650 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
27660 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
27670 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
27680 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
27690 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
276a0 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
276b0 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
276c0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
276d0 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
276e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
276f0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
27700 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27710 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27720 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
27730 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
27740 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
27750 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
27760 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
27770 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
27780 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
27790 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
277a0 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
277b0 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
277c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
277d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
277e0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
277f0 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
27800 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
27810 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
27820 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
27830 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
27840 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
27850 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
27860 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
27870 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
27880 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
27890 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
278a0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
278b0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
278c0 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
278d0 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
278e0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
278f0 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
27900 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
27910 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
27920 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
27930 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
27940 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
27950 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
27960 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
27970 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
27980 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
27990 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
279a0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
279b0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
279c0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
279d0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
279e0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
279f0 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
27a00 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
27a10 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
27a20 6f 77 20 70 61 67 65 73 0a 2a 2a 20 74 68 69 73  ow pages.** this
27a30 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
27a40 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
27a50 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 75   and lazily popu
27a60 6c 61 74 65 0a 2a 2a 20 74 68 65 20 6f 76 65 72  late.** the over
27a70 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
27a80 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
27a90 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
27aa0 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20   .** Subsequent 
27ab0 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63  calls use this c
27ac0 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65  ache to make see
27ad0 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  king to the supp
27ae0 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20  lied offset .** 
27af0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
27b00 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
27b10 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
27b20 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
27b30 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 75  allocated, it mu
27b40 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
27b50 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
27b60 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
27b70 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
27b80 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
27b90 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
27ba0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
27bb0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
27bc0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
27bd0 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
27be0 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
27bf0 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
27c00 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
27c10 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
27c20 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
27c30 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
27c40 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
27c50 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
27c60 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
27c70 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
27c80 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
27c90 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
27ca0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
27cb0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
27cc0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
27cd0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
27ce0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
27cf0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
27d00 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
27d10 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
27d20 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
27d30 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
27d40 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
27d50 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
27d60 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
27d70 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
27d80 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
27d90 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
27da0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
27db0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
27dc0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
27dd0 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
27de0 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
27df0 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
27e00 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
27e10 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
27e20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
27e30 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
27e40 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
27e50 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20 20  Cur->pPage;     
27e60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
27e70 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
27e80 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
27e90 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
27ea0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
27eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
27ec0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
27ed0 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
27ee0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
27ef0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
27f00 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
27f10 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
27f20 74 20 3d 20 70 42 75 66 3b 20 20 20 20 20 2f 2a  t = pBuf;     /*
27f30 20 53 74 61 72 74 20 6f 66 20 6f 72 69 67 69 6e   Start of origin
27f40 61 6c 20 6f 75 74 20 62 75 66 66 65 72 20 2a 2f  al out buffer */
27f50 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
27f60 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
27f70 73 65 72 74 28 20 65 4f 70 3d 3d 30 20 7c 7c 20  sert( eOp==0 || 
27f80 65 4f 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eOp==1 );.  asse
27f90 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
27fa0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
27fb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27fc0 2d 3e 69 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  ->ix<pPage->nCel
27fd0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  l );.  assert( c
27fe0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27ff0 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
28000 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
28010 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
28020 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
28030 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
28040 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69  t+amt <= pCur->i
28050 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
28060 0a 20 20 61 73 73 65 72 74 28 20 61 50 61 79 6c  .  assert( aPayl
28070 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  oad > pPage->aDa
28080 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75 70 74  ta );.  if( (upt
28090 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20 70 50  r)(aPayload - pP
280a0 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20 28 70  age->aData) > (p
280b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
280c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
280d0 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  al) ){.    /* Tr
280e0 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
280f0 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
28100 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
28110 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  s an error.  The
28120 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74 69 6f  .    ** conditio
28130 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72 65 61  nal above is rea
28140 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20 20 26  lly:.    **    &
28150 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69  aPayload[pCur->i
28160 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70  nfo.nLocal] > &p
28170 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
28180 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20 20 20  >usableSize].   
28190 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63 61 73   ** but is recas
281a0 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72 72 65  t into its curre
281b0 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f 69 64  nt form to avoid
281c0 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66 6c 6f   integer overflo
281d0 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20 20 2a  w problems.    *
281e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
281f0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
28200 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  (pPage);.  }..  
28210 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61  /* Check if data
28220 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72   must be read/wr
28230 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68  itten to/from th
28240 65 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73  e btree page its
28250 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66  elf. */.  if( of
28260 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e  fset<pCur->info.
28270 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e  nLocal ){.    in
28280 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69  t a = amt;.    i
28290 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72  f( a+offset>pCur
282a0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
282b0 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d  .      a = pCur-
282c0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f  >info.nLocal - o
282d0 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20  ffset;.    }.   
282e0 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61   rc = copyPayloa
282f0 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73  d(&aPayload[offs
28300 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f  et], pBuf, a, eO
28310 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  p, pPage->pDbPag
28320 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
28330 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
28340 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
28350 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
28360 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
28370 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
28380 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
28390 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
283a0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
283b0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
283c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
283d0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
283e0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
283f0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
28400 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
28410 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
28420 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
28430 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
28440 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
28450 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
28460 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
28470 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
28480 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
28490 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65  .    ** The aOve
284a0 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73  rflow[] array is
284b0 20 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e   sized at one en
284c0 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65  try for each ove
284d0 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a  rflow page.    *
284e0 2a 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  * in the overflo
284f0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
28500 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
28510 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70  first overflow p
28520 61 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74  age is.    ** st
28530 6f 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f  ored in aOverflo
28540 77 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c  w[0], etc. A val
28550 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61  ue of 0 in the a
28560 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
28570 0a 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e  .    ** means "n
28580 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74  ot yet known" (t
28590 68 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69  he cache is lazi
285a0 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20  ly populated).. 
285b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
285c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
285d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
285e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
285f0 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
28600 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
28610 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
28620 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
28630 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
28640 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 3d 3d  Cur->aOverflow==
28650 30 0a 20 20 20 20 20 20 20 7c 7c 20 6e 4f 76 66  0.       || nOvf
28660 6c 2a 28 69 6e 74 29 73 69 7a 65 6f 66 28 50 67  l*(int)sizeof(Pg
28670 6e 6f 29 20 3e 20 73 71 6c 69 74 65 33 4d 61 6c  no) > sqlite3Mal
28680 6c 6f 63 53 69 7a 65 28 70 43 75 72 2d 3e 61 4f  locSize(pCur->aO
28690 76 65 72 66 6c 6f 77 29 0a 20 20 20 20 20 20 29  verflow).      )
286a0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
286b0 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
286c0 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
286d0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
286e0 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
286f0 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
28700 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
28710 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
28720 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
28730 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
28740 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65  BKPT;.        }e
28750 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28760 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
28770 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
28780 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
28790 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65  emset(pCur->aOve
287a0 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a  rflow, 0, nOvfl*
287b0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20  sizeof(Pgno));. 
287c0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
287d0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
287e0 64 4f 76 66 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  dOvfl;.    }else
287f0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
28800 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
28810 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
28820 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
28830 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  d the.      ** e
28840 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
28850 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
28860 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
28870 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 20 20 2a  id, skip.      *
28880 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74  * directly to it
28890 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
288a0 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
288b0 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
288c0 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 20  Size] ){.       
288d0 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f   iIdx = (offset/
288e0 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20  ovflSize);.     
288f0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
28900 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
28910 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 6f 66 66  dx];.        off
28920 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76  set = (offset%ov
28930 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  flSize);.      }
28940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
28950 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
28960 4b 20 26 26 20 61 6d 74 3e 30 20 29 3b 0a 20 20  K && amt>0 );.  
28970 20 20 77 68 69 6c 65 28 20 6e 65 78 74 50 61 67    while( nextPag
28980 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
28990 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c   required, popul
289a0 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
289b0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
289c0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
289d0 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
289e0 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
289f0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75            || pCu
28a00 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
28a10 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20  x]==nextPage.   
28a20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
28a30 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
28a40 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
28a50 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61  w[iIdx] = nextPa
28a60 67 65 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  ge;..      if( o
28a70 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
28a80 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
28a90 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
28aa0 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
28ab0 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
28ac0 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
28ad0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
28ae0 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
28af0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
28b00 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
28b10 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
28b20 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
28b30 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
28b40 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
28b50 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
28b60 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
28b70 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
28b80 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
28b90 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
28ba0 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
28bb0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28bc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28bd0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
28be0 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
28bf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
28c00 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
28c10 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
28c20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
28c30 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
28c40 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
28c50 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
28c60 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
28c70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
28c90 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
28ca0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
28cb0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
28cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
28cd0 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
28ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28cf0 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
28d00 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
28d10 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
28d20 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
28d30 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
28d40 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
28d50 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
28d60 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
28d70 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
28d80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
28d90 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
28da0 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66       if( a + off
28db0 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29  set > ovflSize )
28dc0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20  {.          a = 
28dd0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
28de0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69  t;.        }..#i
28df0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
28e00 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
28e10 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
28e20 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ll the following
28e30 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20   are true:.     
28e40 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
28e50 20 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20     1) this is a 
28e60 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20  read operation, 
28e70 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  and .        ** 
28e80 20 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71    2) data is req
28e90 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73  uired from the s
28ea0 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65  tart of this ove
28eb0 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a  rflow page, and.
28ec0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20          **   3) 
28ed0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 69 72  there are no dir
28ee0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
28ef0 70 61 67 65 2d 63 61 63 68 65 0a 20 20 20 20 20  page-cache.     
28f00 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 20 64     **   4) the d
28f10 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
28f20 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
28f30 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20      **   5) the 
28f40 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
28f50 68 65 20 57 41 4c 20 66 69 6c 65 0a 20 20 20 20  he WAL file.    
28f60 20 20 20 20 2a 2a 20 20 20 36 29 20 61 74 20 6c      **   6) at l
28f70 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61 76  east 4 bytes hav
28f80 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 72  e already been r
28f90 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ead into the out
28fa0 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20 20  put buffer .    
28fb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
28fc0 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e 20  * then data can 
28fd0 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79  be read directly
28fe0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28ff0 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68 65  se file into the
29000 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74 70  .        ** outp
29010 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61 73  ut buffer, bypas
29020 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63 61  sing the page-ca
29030 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  che altogether. 
29040 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20 20  This speeds.    
29050 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69 6e      ** up loadin
29060 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73 20  g large records 
29070 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20 6f  that span many o
29080 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20  verflow pages.. 
29090 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
290a0 20 20 69 66 28 20 65 4f 70 3d 3d 30 20 20 20 20    if( eOp==0    
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290d0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29 20           /* (1) 
290e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 6f  */.         && o
290f0 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20 20  ffset==0        
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29120 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20    /* (2) */.    
29130 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
29140 61 67 65 72 44 69 72 65 63 74 52 65 61 64 4f 6b  agerDirectReadOk
29150 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
29160 78 74 50 61 67 65 29 20 20 20 20 2f 2a 20 28 33  xtPage)    /* (3
29170 2c 34 2c 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  ,4,5) */.       
29180 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
29190 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291b0 20 20 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a          /* (6) *
291c0 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
291d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
291e0 69 6c 65 20 2a 66 64 20 3d 20 73 71 6c 69 74 65  ile *fd = sqlite
291f0 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e  3PagerFile(pBt->
29200 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
29210 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
29220 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
29230 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
29240 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
29250 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
29260 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
29270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29280 20 2f 2a 20 64 75 65 20 74 6f 20 28 36 29 20 2a   /* due to (6) *
29290 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
292a0 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
292b0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
292c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
292d0 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
292e0 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
292f0 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
29300 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
29310 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
29320 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
29330 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
29340 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
29350 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
29360 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
29370 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
29380 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
29390 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
293a0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
293b0 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
293c0 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
293d0 20 20 20 20 20 20 20 20 20 20 28 65 4f 70 3d 3d            (eOp==
293e0 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45  0 ? PAGER_GET_RE
293f0 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20 20 20  ADONLY : 0).    
29400 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29410 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
29420 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29430 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73      aPayload = s
29440 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
29450 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
29460 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
29470 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
29480 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
29490 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
294a0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
294b0 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
294c0 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
294d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
294e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
294f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
29500 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
29510 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
29520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29530 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
29540 20 20 69 66 28 20 61 6d 74 3d 3d 30 20 29 20 72    if( amt==0 ) r
29550 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
29560 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
29570 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
29580 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
29590 20 69 49 64 78 2b 2b 3b 0a 20 20 20 20 7d 0a 20   iIdx++;.    }. 
295a0 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
295b0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
295c0 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 76 65 72 66   ){.    /* Overf
295d0 6c 6f 77 20 63 68 61 69 6e 20 65 6e 64 73 20 70  low chain ends p
295e0 72 65 6d 61 74 75 72 65 6c 79 20 2a 2f 0a 20 20  rematurely */.  
295f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29600 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61  CORRUPT_PAGE(pPa
29610 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
29620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29630 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
29640 70 61 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20  payload for the 
29650 72 6f 77 20 61 74 20 77 68 69 63 68 20 74 68 61  row at which tha
29660 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  t cursor pCur is
29670 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f   currently.** po
29680 69 6e 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62  inting.  "amt" b
29690 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
296a0 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
296b0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
296c0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
296d0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
296e0 20 70 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69   pCur can be poi
296f0 6e 74 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20  nting to either 
29700 61 20 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e  a table or an in
29710 64 65 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49  dex b-tree..** I
29720 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  f pointing to a 
29730 74 61 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65  table btree, the
29740 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65  n the content se
29750 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20  ction is read.  
29760 49 66 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f  If.** pCur is po
29770 69 6e 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64  inting to an ind
29780 65 78 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74  ex b-tree then t
29790 68 65 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69  he key section i
297a0 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s read..**.** Fo
297b0 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  r sqlite3BtreePa
297c0 79 6c 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c  yload(), the cal
297d0 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
297e0 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
297f0 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
29800 6c 69 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74  lid row in the t
29810 61 62 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74  able.  For sqlit
29820 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
29830 65 63 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20  ecked(), the.** 
29840 63 75 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20  cursor might be 
29850 69 6e 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74  invalid or might
29860 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 73 74   need to be rest
29870 6f 72 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e  ored before bein
29880 67 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  g read..**.** Re
29890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
298a0 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
298b0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
298c0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
298d0 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
298e0 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
298f0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
29900 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
29910 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
29920 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
29930 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28  te3BtreePayload(
29940 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29950 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20  u32 offset, u32 
29960 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29  amt, void *pBuf)
29970 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
29980 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
29990 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
299a0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
299b0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
299c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
299d0 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
299e0 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
299f0 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75 72  t( pCur->ix<pCur
29a00 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ->pPage->nCell )
29a10 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65 73  ;.  return acces
29a20 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
29a30 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73  ffset, amt, (uns
29a40 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66  igned char*)pBuf
29a50 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
29a60 68 69 73 20 76 61 72 69 61 6e 74 20 6f 66 20 73  his variant of s
29a70 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
29a80 61 64 28 29 20 77 6f 72 6b 73 20 65 76 65 6e 20  ad() works even 
29a90 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  if the cursor ha
29aa0 73 20 6e 6f 74 0a 2a 2a 20 69 6e 20 74 68 65 20  s not.** in the 
29ab0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 73 74 61  CURSOR_VALID sta
29ac0 74 65 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  te.  It is only 
29ad0 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c 69  used by the sqli
29ae0 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 29 0a  te3_blob_read().
29af0 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ** interface..*/
29b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29b10 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 73 74  OMIT_INCRBLOB.st
29b20 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
29b30 4c 49 4e 45 20 69 6e 74 20 61 63 63 65 73 73 50  LINE int accessP
29b40 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 0a 20  ayloadChecked(. 
29b50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
29b60 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 0a 20  .  u32 offset,. 
29b70 20 75 33 32 20 61 6d 74 2c 0a 20 20 76 6f 69 64   u32 amt,.  void
29b80 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 6e 74 20   *pBuf.){.  int 
29b90 72 63 3b 0a 20 20 69 66 20 28 20 70 43 75 72 2d  rc;.  if ( pCur-
29ba0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29bb0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
29bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
29bd0 52 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  RT;.  }.  assert
29be0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29bf0 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29c00 72 63 20 3d 20 62 74 72 65 65 52 65 73 74 6f 72  rc = btreeRestor
29c10 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
29c20 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  pCur);.  return 
29c30 72 63 20 3f 20 72 63 20 3a 20 61 63 63 65 73 73  rc ? rc : access
29c40 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
29c50 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
29c60 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
29c70 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68  e3BtreePayloadCh
29c80 65 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a  ecked(BtCursor *
29c90 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
29ca0 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
29cb0 2a 70 42 75 66 29 7b 0a 20 20 69 66 28 20 70 43  *pBuf){.  if( pC
29cc0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29cd0 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
29ce0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29cf0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29d00 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   );.    return a
29d10 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
29d20 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20  r, offset, amt, 
29d30 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  pBuf, 0);.  }els
29d40 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 63  e{.    return ac
29d50 63 65 73 73 50 61 79 6c 6f 61 64 43 68 65 63 6b  cessPayloadCheck
29d60 65 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ed(pCur, offset,
29d70 20 61 6d 74 2c 20 70 42 75 66 29 3b 0a 20 20 7d   amt, pBuf);.  }
29d80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29d90 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
29da0 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  B */../*.** Retu
29db0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
29dc0 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74  payload informat
29dd0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e 74  ion from the ent
29de0 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20  ry that the .** 
29df0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
29e00 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65  ointing to.  The
29e10 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20 74   pointer is to t
29e20 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a  he beginning of.
29e30 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69 6e  ** the key if in
29e40 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61 67  dex btrees (pPag
29e50 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61 6e  e->intKey==0) an
29e60 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66 6f  d is the data fo
29e70 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65 65  r.** table btree
29e80 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
29e90 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65 72  ==1). The number
29ea0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61   of bytes of ava
29eb0 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64 61  ilable.** key/da
29ec0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ta is written in
29ed0 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70  to *pAmt.  If *p
29ee0 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  Amt==0, then the
29ef0 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72 6e   value.** return
29f00 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  ed will not be a
29f10 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a   valid pointer..
29f20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
29f30 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ne is an optimiz
29f40 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f  ation.  It is co
29f50 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74  mmon for the ent
29f60 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64  ire key.** and d
29f70 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  ata to fit on th
29f80 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64  e local page and
29f90 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65   for there to be
29fa0 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   no overflow.** 
29fb0 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61  pages.  When tha
29fc0 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f  t is so, this ro
29fd0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65  utine can be use
29fe0 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a  d to access the.
29ff0 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20  ** key and data 
2a000 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61  without making a
2a010 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b   copy.  If the k
2a020 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73  ey and/or data s
2a030 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76  pills.** onto ov
2a040 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
2a050 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  en accessPayload
2a060 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20  () must be used 
2a070 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a 2a  to reassemble.**
2a080 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e   the key/data an
2a090 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61  d copy it into a
2a0a0 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75   preallocated bu
2a0b0 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ffer..**.** The 
2a0c0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
2a0d0 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
2a0e0 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20   looks directly 
2a0f0 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a  into the cached.
2a100 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  ** page of the d
2a110 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61  atabase.  The da
2a120 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  ta might change 
2a130 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74  or move the next
2a140 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72   time.** any btr
2a150 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ee routine is ca
2a160 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lled..*/.static 
2a170 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74 63  const void *fetc
2a180 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  hPayload(.  BtCu
2a190 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2a1a0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
2a1b0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
2a1c0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
2a1d0 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20 20  32 *pAmt        
2a1e0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
2a1f0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
2a200 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20  able bytes here 
2a210 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 74 3b  */.){.  int amt;
2a220 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
2a230 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
2a240 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 70 50  e>=0 && pCur->pP
2a250 61 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20  age);.  assert( 
2a260 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a270 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a280 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2a290 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
2a2a0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
2a2b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
2a2c0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2a2d0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2a2e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3c  ssert( pCur->ix<
2a2f0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
2a300 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
2a310 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a320 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
2a330 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
2a340 6f 61 64 3e 70 43 75 72 2d 3e 70 50 61 67 65 2d  oad>pCur->pPage-
2a350 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50  >aData || CORRUP
2a360 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
2a370 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  ( pCur->info.pPa
2a380 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 70 50 61 67  yload<pCur->pPag
2a390 65 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  e->aDataEnd ||CO
2a3a0 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
2a3b0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
2a3c0 6f 63 61 6c 3b 0a 20 20 69 66 28 20 61 6d 74 3e  ocal;.  if( amt>
2a3d0 28 69 6e 74 29 28 70 43 75 72 2d 3e 70 50 61 67  (int)(pCur->pPag
2a3e0 65 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43  e->aDataEnd - pC
2a3f0 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
2a400 64 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  d) ){.    /* The
2a410 72 65 20 69 73 20 74 6f 6f 20 6c 69 74 74 6c 65  re is too little
2a420 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61   space on the pa
2a430 67 65 20 66 6f 72 20 74 68 65 20 65 78 70 65 63  ge for the expec
2a440 74 65 64 20 61 6d 6f 75 6e 74 0a 20 20 20 20 2a  ted amount.    *
2a450 2a 20 6f 66 20 6c 6f 63 61 6c 20 63 6f 6e 74 65  * of local conte
2a460 6e 74 2e 20 44 61 74 61 62 61 73 65 20 6d 75 73  nt. Database mus
2a470 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f  t be corrupt. */
2a480 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
2a490 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
2a4a0 6d 74 20 3d 20 4d 41 58 28 30 2c 20 28 69 6e 74  mt = MAX(0, (int
2a4b0 29 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 61  )(pCur->pPage->a
2a4c0 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
2a4d0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 29 3b  info.pPayload));
2a4e0 0a 20 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 28  .  }.  *pAmt = (
2a4f0 75 33 32 29 61 6d 74 3b 0a 20 20 72 65 74 75 72  u32)amt;.  retur
2a500 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69  n (void*)pCur->i
2a510 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a  nfo.pPayload;.}.
2a520 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2a530 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
2a540 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
2a550 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
2a560 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
2a570 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
2a580 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
2a590 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
2a5a0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
2a5b0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
2a5c0 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
2a5d0 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
2a5e0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
2a5f0 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
2a600 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
2a610 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
2a620 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
2a630 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
2a640 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
2a650 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
2a660 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
2a670 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
2a680 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
2a690 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
2a6a0 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
2a6b0 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
2a6c0 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
2a6d0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
2a6e0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
2a6f0 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
2a700 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
2a710 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
2a720 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
2a730 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2a740 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
2a750 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
2a760 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
2a770 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79  *sqlite3BtreePay
2a780 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75 72 73  loadFetch(BtCurs
2a790 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70  or *pCur, u32 *p
2a7a0 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  Amt){.  return f
2a7b0 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
2a7c0 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pAmt);.}.../*.
2a7d0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2a7e0 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77  or down to a new
2a7f0 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68   child page.  Th
2a800 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65  e newPgno argume
2a810 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67  nt is the.** pag
2a820 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2a830 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f  child page to mo
2a840 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ve to..**.** Thi
2a850 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
2a860 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ns SQLITE_CORRUP
2a870 54 20 69 66 20 74 68 65 20 70 61 67 65 2d 68 65  T if the page-he
2a880 61 64 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64  ader flags field
2a890 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63   of.** the new c
2a8a0 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e  hild page does n
2a8b0 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61  ot match the fla
2a8c0 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  gs field of the 
2a8d0 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20  parent (i.e..** 
2a8e0 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67  if an intkey pag
2a8f0 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
2a900 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20  the parent of a 
2a910 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c  non-intkey page,
2a920 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73   or.** vice-vers
2a930 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  a)..*/.static in
2a940 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
2a950 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
2a960 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74  2 newPgno){.  Bt
2a970 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
2a980 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
2a990 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2a9a0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2a9b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a9c0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2a9d0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2a9e0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54  ( pCur->iPage<BT
2a9f0 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
2aa00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2aa10 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a  ur->iPage>=0 );.
2aa20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2aa30 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58  e>=(BTCURSOR_MAX
2aa40 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20  _DEPTH-1) ){.   
2aa50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2aa60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
2aa70 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2aa80 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2aa90 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2aaa0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2aab0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2aac0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2aad0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72  r->iPage] = pCur
2aae0 2d 3e 69 78 3b 0a 20 20 70 43 75 72 2d 3e 61 70  ->ix;.  pCur->ap
2aaf0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ab00 5d 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  ] = pCur->pPage;
2ab10 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b  .  pCur->ix = 0;
2ab20 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
2ab30 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
2ab40 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
2ab50 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 70  ewPgno, &pCur->p
2ab60 50 61 67 65 2c 20 70 43 75 72 2c 20 70 43 75 72  Page, pCur, pCur
2ab70 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
2ab80 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2ab90 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
2aba0 61 67 65 20 70 50 61 72 65 6e 74 20 69 73 20 61  age pParent is a
2abb0 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d  n internal (non-
2abc0 6c 65 61 66 29 20 74 72 65 65 20 70 61 67 65 2e  leaf) tree page.
2abd0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
2abe0 2a 2a 20 61 73 73 65 72 74 73 20 74 68 61 74 20  ** asserts that 
2abf0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
2ac00 6c 64 20 69 73 20 74 68 65 20 6c 65 66 74 2d 63  ld is the left-c
2ac10 68 69 6c 64 20 69 66 20 74 68 65 20 69 49 64 78  hild if the iIdx
2ac20 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70  'th.** cell in p
2ac30 61 67 65 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c  age pParent. Or,
2ac40 20 69 66 20 69 49 64 78 20 69 73 20 65 71 75 61   if iIdx is equa
2ac50 6c 20 74 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e  l to the total n
2ac60 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c  umber of.** cell
2ac70 73 20 69 6e 20 70 50 61 72 65 6e 74 2c 20 74 68  s in pParent, th
2ac80 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
2ac90 43 68 69 6c 64 20 69 73 20 74 68 65 20 72 69 67  Child is the rig
2aca0 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74  ht-child of.** t
2acb0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
2acc0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 50 61  ic void assertPa
2acd0 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d 50 61 67  rentIndex(MemPag
2ace0 65 20 2a 70 50 61 72 65 6e 74 2c 20 69 6e 74 20  e *pParent, int 
2acf0 69 49 64 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c  iIdx, Pgno iChil
2ad00 64 29 7b 0a 20 20 69 66 28 20 43 4f 52 52 55 50  d){.  if( CORRUP
2ad10 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 20 20  T_DB ) return;  
2ad20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e  /* The condition
2ad30 73 20 74 65 73 74 65 64 20 62 65 6c 6f 77 20 6d  s tested below m
2ad40 69 67 68 74 20 6e 6f 74 20 62 65 20 74 72 75 65  ight not be true
2ad50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ad60 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
2ad70 69 6e 20 61 20 63 6f 72 72 75 70 74 20 64 61 74  in a corrupt dat
2ad80 61 62 61 73 65 20 2a 2f 0a 20 20 61 73 73 65 72  abase */.  asser
2ad90 74 28 20 69 49 64 78 3c 3d 70 50 61 72 65 6e 74  t( iIdx<=pParent
2ada0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28  ->nCell );.  if(
2adb0 20 69 49 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e   iIdx==pParent->
2adc0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73  nCell ){.    ass
2add0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 26 70  ert( get4byte(&p
2ade0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2adf0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2ae00 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a  +8])==iChild );.
2ae10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
2ae20 65 72 74 28 20 67 65 74 34 62 79 74 65 28 66 69  ert( get4byte(fi
2ae30 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
2ae40 69 49 64 78 29 29 3d 3d 69 43 68 69 6c 64 20 29  iIdx))==iChild )
2ae50 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
2ae60 20 64 65 66 69 6e 65 20 61 73 73 65 72 74 50 61   define assertPa
2ae70 72 65 6e 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29  rentIndex(x,y,z)
2ae80 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20   .#endif../*.** 
2ae90 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2aea0 75 70 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  up to the parent
2aeb0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75   page..**.** pCu
2aec0 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f  r->idx is set to
2aed0 20 74 68 65 20 63 65 6c 6c 20 69 6e 64 65 78 20   the cell index 
2aee0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
2aef0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  e pointer.** to 
2af00 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
2af10 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66  coming from.  If
2af20 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
2af30 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69 67 68 74  rom the.** right
2af40 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70 61 67 65  -most child page
2af50 20 74 68 65 6e 20 70 43 75 72 2d 3e 69 64 78 20   then pCur->idx 
2af60 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f  is set to one mo
2af70 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c  re than.** the l
2af80 61 72 67 65 73 74 20 63 65 6c 6c 20 69 6e 64 65  argest cell inde
2af90 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
2afa0 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42  d moveToParent(B
2afb0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2afc0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
2afd0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2afe0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2aff0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b000 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b010 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b020 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2b030 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73 73  iPage>0 );.  ass
2b040 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
2b050 20 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65   );.  assertPare
2b060 6e 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75  ntIndex(.    pCu
2b070 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b080 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
2b090 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b0a0 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20  >iPage-1], .    
2b0b0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 67 6e  pCur->pPage->pgn
2b0c0 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63 61 73  o.  );.  testcas
2b0d0 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  e( pCur->aiIdx[p
2b0e0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20  Cur->iPage-1] > 
2b0f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b100 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65  r->iPage-1]->nCe
2b110 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e  ll );.  pCur->in
2b120 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2b130 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2b140 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
2b150 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
2b160 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d  l);.  pCur->ix =
2b170 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b180 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20 70  r->iPage-1];.  p
2b190 4c 65 61 66 20 3d 20 70 43 75 72 2d 3e 70 50 61  Leaf = pCur->pPa
2b1a0 67 65 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  ge;.  pCur->pPag
2b1b0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2b1c0 5b 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  [--pCur->iPage];
2b1d0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
2b1e0 74 4e 75 6c 6c 28 70 4c 65 61 66 29 3b 0a 7d 0a  tNull(pLeaf);.}.
2b1f0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
2b200 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
2b210 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
2b220 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
2b230 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
2b240 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
2b250 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
2b260 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
2b270 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
2b280 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
2b290 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
2b2a0 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
2b2b0 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
2b2c0 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
2b2d0 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
2b2e0 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
2b2f0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
2b300 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
2b310 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
2b320 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
2b330 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
2b340 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
2b350 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
2b360 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
2b370 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
2b380 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
2b390 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
2b3a0 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
2b3b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 61 6e 64  RSOR_INVALID and
2b3c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2b3d0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 45 4d 50  turns SQLITE_EMP
2b3e0 54 59 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  TY. Otherwise,.*
2b3f0 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
2b400 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
2b410 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6c  the first cell l
2b420 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
2b430 6f 74 0a 2a 2a 20 28 6f 72 20 76 69 72 74 75 61  ot.** (or virtua
2b440 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61 6e 64  l root) page and
2b450 20 74 68 65 20 63 75 72 73 6f 72 20 73 74 61 74   the cursor stat
2b460 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
2b470 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
2b480 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
2b490 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
2b4a0 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
2b4b0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
2b4c0 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
2b4d0 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
2b4e0 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
2b4f0 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
2b500 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
2b510 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
2b520 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
2b530 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
2b540 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
2b550 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
2b560 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
2b570 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
2b580 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
2b590 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
2b5a0 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
2b5b0 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
2b5c0 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
2b5d0 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
2b5e0 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
2b5f0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
2b600 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
2b610 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
2b620 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
2b630 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
2b640 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
2b650 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2b660 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
2b670 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
2b680 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
2b690 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2b6a0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2b6b0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
2b6c0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
2b6d0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2b6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
2b6f0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
2b700 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
2b720 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
2b730 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2b740 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
2b750 43 75 72 2d 3e 65 53 74 61 74 65 20 3c 20 43 55  Cur->eState < CU
2b760 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2b770 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c   || pCur->iPage<
2b780 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2b790 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3e 30 20  Cur->pgnoRoot>0 
2b7a0 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3c 30  || pCur->iPage<0
2b7b0 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72 2d   );..  if( pCur-
2b7c0 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
2b7d0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2b7e0 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
2b7f0 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75  ePageNotNull(pCu
2b800 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20 20  r->pPage);.     
2b810 20 77 68 69 6c 65 28 20 2d 2d 70 43 75 72 2d 3e   while( --pCur->
2b820 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  iPage ){.       
2b830 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
2b840 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
2b850 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
2b860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2b870 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72  ur->pPage = pCur
2b880 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 20  ->apPage[0];.   
2b890 20 20 20 67 6f 74 6f 20 73 6b 69 70 5f 69 6e 69     goto skip_ini
2b8a0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  t;.    }.  }else
2b8b0 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52   if( pCur->pgnoR
2b8c0 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43  oot==0 ){.    pC
2b8d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2b8e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
2b8f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2b900 4d 50 54 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  MPTY;.  }else{. 
2b910 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2b920 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a  >iPage==(-1) );.
2b930 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2b940 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
2b950 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
2b960 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2b970 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2b980 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2b990 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2b9a0 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  xt!=SQLITE_OK );
2b9b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2b9c0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
2b9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2b9e0 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
2b9f0 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
2ba00 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41   }.    rc = getA
2ba10 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d  ndInitPage(pCur-
2ba20 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43  >pBtree->pBt, pC
2ba30 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  ur->pgnoRoot, &p
2ba40 43 75 72 2d 3e 70 50 61 67 65 2c 0a 20 20 20 20  Cur->pPage,.    
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba60 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
2ba70 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
2ba80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ba90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
2baa0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2bab0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2bac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2bad0 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
2bae0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
2baf0 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
2bb00 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
2bb10 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20  ;.  }.  pRoot = 
2bb20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
2bb30 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67  ssert( pRoot->pg
2bb40 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  no==pCur->pgnoRo
2bb50 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ot );..  /* If p
2bb60 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73  Cur->pKeyInfo is
2bb70 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
2bb80 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
2bb90 6f 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73  opened this curs
2bba0 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64  or.  ** expected
2bbb0 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61   to open it on a
2bbc0 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20  n index b-tree. 
2bbd0 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b  Otherwise, if pK
2bbe0 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e  eyInfo is.  ** N
2bbf0 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ULL, the caller 
2bc00 65 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20  expects a table 
2bc10 62 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20  b-tree. If this 
2bc20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c  is not the case,
2bc30 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20  .  ** return an 
2bc40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65  SQLITE_CORRUPT e
2bc50 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  rror. .  **.  **
2bc60 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
2bc70 73 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75  s of SQLite assu
2bc80 6d 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65  med that this te
2bc90 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69  st could not fai
2bca0 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f  l.  ** if the ro
2bcb0 6f 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65  ot page was alre
2bcc0 61 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20  ady loaded when 
2bcd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61  this function wa
2bce0 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20  s called (i.e.. 
2bcf0 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61   ** if pCur->iPa
2bd00 67 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73  ge>=0). But this
2bd10 20 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68   is not so if th
2bd20 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f  e database is co
2bd30 72 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e  rrupted .  ** in
2bd40 20 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74   such a way that
2bd50 20 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c   page pRoot is l
2bd60 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63  inked into a sec
2bd70 6f 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65  ond b-tree table
2bd80 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66   .  ** (or the f
2bd90 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20  reelist).  */.  
2bda0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69  assert( pRoot->i
2bdb0 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f  ntKey==1 || pRoo
2bdc0 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a  t->intKey==0 );.
2bdd0 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49    if( pRoot->isI
2bde0 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nit==0 || (pCur-
2bdf0 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70  >pKeyInfo==0)!=p
2be00 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Root->intKey ){.
2be10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2be20 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70  E_CORRUPT_PAGE(p
2be30 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d  Cur->pPage);.  }
2be40 0a 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20  ..skip_init:  . 
2be50 20 70 43 75 72 2d 3e 69 78 20 3d 20 30 3b 0a 20   pCur->ix = 0;. 
2be60 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2be70 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  e = 0;.  pCur->c
2be80 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43  urFlags &= ~(BTC
2be90 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2bea0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
2beb0 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f  idOvfl);..  pRoo
2bec0 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  t = pCur->pPage;
2bed0 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
2bee0 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
2bef0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2bf00 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
2bf10 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
2bf20 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
2bf30 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
2bf40 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
2bf50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
2bf60 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2bf70 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
2bf80 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
2bf90 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
2bfa0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
2bfb0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2bfc0 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
2bfd0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2bfe0 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
2bff0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
2c000 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
2c010 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 63  _INVALID;.    rc
2c020 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
2c030 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2c040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
2c050 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
2c060 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  to the left-most
2c070 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65   leaf entry bene
2c080 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79  ath the.** entry
2c090 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73 20   to which it is 
2c0a0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
2c0b0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  ng..**.** The le
2c0c0 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20  ft-most leaf is 
2c0d0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
2c0e0 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20   smallest key - 
2c0f0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20  the first.** in 
2c100 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
2c110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2c120 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74  oveToLeftmost(Bt
2c130 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2c140 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e   Pgno pgno;.  in
2c150 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2c160 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2c170 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2c180 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2c190 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2c1a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2c1b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
2c1c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
2c1d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
2c1e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2c1f0 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
2c200 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2c210 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2c220 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
2c230 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2c240 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 78 29 29  Page, pCur->ix))
2c250 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2c260 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
2c270 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
2c280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
2c290 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
2c2a0 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
2c2b0 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
2c2c0 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
2c2d0 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
2c2e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
2c2f0 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
2c300 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
2c310 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
2c320 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
2c330 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
2c340 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
2c350 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
2c360 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
2c370 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
2c380 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
2c390 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
2c3a0 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
2c3b0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
2c3c0 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
2c3d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
2c3e0 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
2c3f0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
2c400 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
2c410 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
2c420 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
2c430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2c440 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
2c450 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2c460 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
2c470 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2c480 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
2c490 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
2c4a0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2c4b0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2c4c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c4d0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2c4e0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
2c4f0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
2c500 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b  >pPage)->leaf ){
2c510 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34  .    pgno = get4
2c520 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2c530 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2c540 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75  set+8]);.    pCu
2c550 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e 6e  r->ix = pPage->n
2c560 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d  Cell;.    rc = m
2c570 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c580 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
2c590 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2c5a0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 20 3d    }.  pCur->ix =
2c5b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2c5c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2c5d0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
2c5e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75  ;.  assert( (pCu
2c5f0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2c600 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30  CF_ValidNKey)==0
2c610 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
2c620 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  ITE_OK;.}../* Mo
2c630 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
2c640 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
2c650 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
2c660 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
2c670 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
2c680 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
2c690 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
2c6a0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
2c6b0 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
2c6c0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
2c6d0 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2c6e0 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
2c6f0 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28  lite3BtreeFirst(
2c700 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2c710 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2c720 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
2c730 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2c740 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2c750 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2c760 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
2c770 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
2c780 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
2c790 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2c7a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c7b0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
2c7c0 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e  ( pCur->pPage->n
2c7d0 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 2a 70  Cell>0 );.    *p
2c7e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Res = 0;.    rc 
2c7f0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
2c800 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 20  (pCur);.  }else 
2c810 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
2c820 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65  MPTY ){.    asse
2c830 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2c840 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
2c850 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2c860 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  ;.    *pRes = 1;
2c870 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c880 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
2c890 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2c8a0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2c8b0 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c8c0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2c8d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2c8e0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2c8f0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2c900 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2c910 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2c920 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2c930 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2c940 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2c950 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2c960 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2c970 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2c980 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2c990 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2c9a0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2c9b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2c9c0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2c9d0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2c9e0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2c9f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2ca00 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2ca10 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2ca20 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2ca30 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2ca40 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2ca50 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2ca60 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2ca70 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2ca80 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2ca90 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2caa0 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2cab0 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2cac0 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2cad0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2cae0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2caf0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2cb00 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2cb10 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2cb20 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2cb30 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2cb40 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2cb50 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2cb60 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2cb70 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2cb80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cb90 69 78 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d  ix==pCur->pPage-
2cba0 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2cbb0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
2cbc0 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  age->leaf );.#en
2cbd0 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2cbe0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2cbf0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2cc00 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2cc10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cc20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2cc30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2cc40 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 2a 70 52  VALID );.    *pR
2cc50 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  es = 0;.    rc =
2cc60 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2cc70 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2cc80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2cc90 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2cca0 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74  Flags |= BTCF_At
2ccb0 4c 61 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Last;.    }else{
2ccc0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72  .      pCur->cur
2ccd0 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2cce0 74 4c 61 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  tLast;.    }.  }
2ccf0 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2cd00 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20  ITE_EMPTY ){.   
2cd10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2cd20 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2cd30 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2cd40 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70 52 65 73  ==0 );.    *pRes
2cd50 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d 20 53   = 1;.    rc = S
2cd60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2cd70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2cd80 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2cd90 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2cda0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
2cdb0 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
2cdc0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
2cdd0 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
2cde0 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
2cdf0 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
2ce00 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
2ce10 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
2ce20 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
2ce30 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
2ce40 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
2ce50 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
2ce60 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
2ce70 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
2ce80 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
2ce90 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
2cea0 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
2ceb0 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2cec0 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
2ced0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
2cee0 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
2cef0 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
2cf00 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
2cf10 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
2cf20 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
2cf30 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
2cf40 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
2cf50 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
2cf60 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
2cf70 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
2cf80 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
2cf90 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
2cfa0 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
2cfb0 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
2cfc0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2cfd0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
2cfe0 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
2cff0 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
2d000 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
2d010 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
2d020 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2d030 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
2d040 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2d050 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2d060 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2d070 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2d080 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
2d090 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2d0a0 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
2d0b0 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0d0 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2d0e0 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
2d0f0 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
2d100 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
2d110 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
2d120 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2d130 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2d140 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2d150 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
2d160 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
2d170 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2d180 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
2d190 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2d1a0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2d1b0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2d1c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2d1d0 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
2d1e0 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2d1f0 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64  y..**.** For ind
2d200 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70  ex tables, the p
2d210 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66  IdxKey->eqSeen f
2d220 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31  ield is set to 1
2d230 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69   if there.** exi
2d240 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  sts an entry in 
2d250 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65  the table that e
2d260 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
2d270 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74  IdxKey.  .*/.int
2d280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2d290 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
2d2a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2d2b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2d2c0 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
2d2d0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
2d2e0 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
2d2f0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
2d300 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
2d310 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
2d320 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2d330 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
2d340 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
2d350 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
2d360 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
2d370 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
2d380 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
2d390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d3a0 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
2d3b0 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
2d3c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
2d3d0 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
2d3e0 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
2d3f0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d400 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2d410 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2d420 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2d430 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2d440 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2d450 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
2d460 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
2d470 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
2d480 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  nfo==0) );.  ass
2d490 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2d4a0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2d4b0 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  || (pIdxKey==0)=
2d4c0 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  =(pCur->curIntKe
2d4d0 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  y!=0) );..  /* I
2d4e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2d4f0 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2d500 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2d510 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2d520 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2d530 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2d540 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2d550 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2d560 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26  pIdxKey==0.   &&
2d570 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d580 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2d590 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2d5a0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2d5b0 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  !=0.  ){.    if(
2d5c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2d5d0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2d5e0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2d5f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2d600 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2d610 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2d620 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2d630 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
2d640 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74  rFlags & BTCF_At
2d650 4c 61 73 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  Last)!=0 ){.    
2d660 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
2d670 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d680 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d690 7d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  }.      /* If th
2d6a0 65 20 72 65 71 75 65 73 74 65 64 20 6b 65 79 20  e requested key 
2d6b0 69 73 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  is one more than
2d6c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6b 65   the previous ke
2d6d0 79 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  y, then.      **
2d6e0 20 74 72 79 20 74 6f 20 67 65 74 20 74 68 65 72   try to get ther
2d6f0 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 42  e using sqlite3B
2d700 74 72 65 65 4e 65 78 74 28 29 20 72 61 74 68 65  treeNext() rathe
2d710 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 0a 20 20  r than a full.  
2d720 20 20 20 20 2a 2a 20 62 69 6e 61 72 79 20 73 65      ** binary se
2d730 61 72 63 68 2e 20 20 54 68 69 73 20 69 73 20 61  arch.  This is a
2d740 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  n optimization o
2d750 6e 6c 79 2e 20 20 54 68 65 20 63 6f 72 72 65 63  nly.  The correc
2d760 74 20 61 6e 73 77 65 72 0a 20 20 20 20 20 20 2a  t answer.      *
2d770 2a 20 69 73 20 73 74 69 6c 6c 20 6f 62 74 61 69  * is still obtai
2d780 6e 65 64 20 77 69 74 68 6f 75 74 20 74 68 69 73  ned without this
2d790 20 63 61 73 65 2c 20 6f 6e 6c 79 20 61 20 6c 69   case, only a li
2d7a0 74 74 6c 65 20 6d 6f 72 65 20 73 6c 6f 77 65 6c  ttle more slowel
2d7b0 79 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  y */.      if( p
2d7c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 2b 31  Cur->info.nKey+1
2d7d0 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2d7e0 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2d7f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2d800 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
2d810 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 0);.        i
2d820 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2d830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65   ){.          ge
2d840 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
2d850 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2d860 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  Cur->info.nKey==
2d870 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2d880 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d890 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2d8a0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2d8b0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
2d8c0 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
2d8d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2d8e0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
2d8f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
2d900 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
2d910 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d920 20 7d 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65   }..  if( pIdxKe
2d930 79 20 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  y ){.    xRecord
2d940 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65  Compare = sqlite
2d950 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
2d960 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70  (pIdxKey);.    p
2d970 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20  IdxKey->errCode 
2d980 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
2d990 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2d9a0 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20  t_rc==1 .       
2d9b0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2d9c0 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20  fault_rc==0 .   
2d9d0 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2d9e0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31  ->default_rc==-1
2d9f0 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
2da00 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2da10 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20  are = 0; /* All 
2da20 6b 65 79 73 20 61 72 65 20 69 6e 74 65 67 65 72  keys are integer
2da30 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  s */.  }..  rc =
2da40 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2da50 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2da60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2da70 45 5f 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20  E_EMPTY ){.     
2da80 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2da90 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2daa0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2dab0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
2dac0 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
2dad0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2dae0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2daf0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2db00 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
2db10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2db20 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
2db30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2db40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2db50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
2db60 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
2db70 65 2d 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a  e->nCell > 0 );.
2db80 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2db90 69 50 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72  iPage==0 || pCur
2dba0 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74  ->apPage[0]->int
2dbb0 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e  Key==pCur->curIn
2dbc0 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  tKey );.  assert
2dbd0 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ( pCur->curIntKe
2dbe0 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a  y || pIdxKey );.
2dbf0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
2dc00 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78  nt lwr, upr, idx
2dc10 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68  , c;.    Pgno ch
2dc20 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67  ldPg;.    MemPag
2dc30 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2dc40 3e 70 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a  >pPage;.    u8 *
2dc50 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2dc80 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2dc90 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2dca0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2dcb0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2dcc0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2dcd0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2dce0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2dcf0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2dd00 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2dd10 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2dd20 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2dd30 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2dd40 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2dd50 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2dd60 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2dd70 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2dd80 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2dd90 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2dda0 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2ddb0 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2ddc0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2ddd0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2dde0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2ddf0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2de00 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2de10 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2de20 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2de30 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2de40 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2de50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2de60 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2de70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2de80 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2de90 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2dea0 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2deb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2dec0 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2ded0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2dee0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2def0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2df00 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2df10 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2df20 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2df30 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78   */.    pCur->ix
2df40 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2df50 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2df60 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2df70 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2df80 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2df90 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2dfa0 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2dfb0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2dfc0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2dfd0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2dfe0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2dff0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2e000 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2e010 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2e020 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20  ->aDataEnd ){.  
2e030 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2e040 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2e050 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
2e060 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2e070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e080 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61   }.        getVa
2e090 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34  rint(pCell, (u64
2e0a0 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  *)&nCellKey);.  
2e0b0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b        if( nCellK
2e0c0 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
2e0d0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2e0e0 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +1;.          if
2e0f0 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d  ( lwr>upr ){ c =
2e100 20 2d 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20   -1; break; }.  
2e110 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e120 6e 43 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20  nCellKey>intKey 
2e130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72  ){.          upr
2e140 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20   = idx-1;.      
2e150 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2e160 29 7b 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b  ){ c = +1; break
2e170 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2e180 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2e190 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69  ert( nCellKey==i
2e1a0 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  ntKey );.       
2e1b0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2e1c0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2e1d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2e1e0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2e1f0 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
2e200 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2e210 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
2e220 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2e230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
2e240 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  ur->curFlags |= 
2e250 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a  BTCF_ValidNKey;.
2e260 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2e270 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43  ->info.nKey = nC
2e280 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2e290 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
2e2a0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
2e2b0 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2e2c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2e2d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2e2e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e2f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2e300 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2e310 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2e320 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2e330 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2e340 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
2e350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e360 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2e370 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f     int nCell;  /
2e380 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43  * Size of the pC
2e390 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65  ell cell in byte
2e3a0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65  s */.        pCe
2e3b0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2e3c0 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2e3d0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
2e3e0 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
2e3f0 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
2e400 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
2e410 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
2e420 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
2e430 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2e440 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
2e450 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
2e460 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
2e470 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
2e480 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
2e490 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
2e4a0 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
2e4b0 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
2e4c0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
2e4d0 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
2e4e0 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
2e4f0 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
2e500 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2e510 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
2e520 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
2e530 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
2e540 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2e550 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
2e560 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
2e570 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
2e580 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
2e590 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
2e5a0 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
2e5b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
2e5c0 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
2e5d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2e5e0 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
2e5f0 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
2e600 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2e610 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
2e620 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2e630 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
2e640 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
2e650 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
2e660 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2e670 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
2e680 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
2e690 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
2e6a0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2e6b0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2e6c0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
2e6d0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2e6e0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2e6f0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2e700 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2e710 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
2e720 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2e730 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
2e740 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
2e750 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
2e760 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
2e770 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
2e780 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
2e790 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2e7a0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
2e7b0 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
2e7c0 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
2e7d0 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
2e7e0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
2e7f0 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2e800 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
2e810 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2e820 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2e830 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
2e840 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2e850 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2e860 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2e870 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
2e880 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2e890 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e8a0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2e8b0 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
2e8c0 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
2e8d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
2e8e0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
2e8f0 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
2e900 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
2e910 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
2e920 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
2e930 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2e940 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2e950 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
2e960 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
2e970 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
2e980 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
2e990 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
2e9a0 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
2e9b0 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  d. .          **
2e9c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2e9d0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
2e9e0 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63  orrupt, the xRec
2e9f0 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69  ordCompare routi
2ea00 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20  ne may read.    
2ea10 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74        ** up to t
2ea20 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20  wo varints past 
2ea30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2ea40 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20  uffer. An extra 
2ea50 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  18 .          **
2ea60 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
2ea70 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  g is allocated a
2ea80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2ea90 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20   buffer in.     
2eaa0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69       ** case thi
2eab0 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20  s happens.  */. 
2eac0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
2ead0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2eae0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
2eaf0 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
2eb00 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
2eb10 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2eb20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
2eb30 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  ll(pPage, pCellB
2eb40 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
2eb50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
2eb60 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
2eb70 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
2eb80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2eb90 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54  Cell<0 );   /* T
2eba0 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20  rue if key size 
2ebb0 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20  is 2^32 or more 
2ebc0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2ebd0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20  tcase( nCell==0 
2ebe0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2ebf0 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2ec00 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20  x80 0x00 */.    
2ec10 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2ec20 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20  nCell==1 );  /* 
2ec30 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2ec40 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2ec50 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  1 */.          t
2ec60 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2ec70 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  2 );  /* Minimum
2ec80 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79   legal index key
2ec90 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20   size */.       
2eca0 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 7c     if( nCell<2 |
2ecb0 7c 20 6e 43 65 6c 6c 2f 70 43 75 72 2d 3e 70 42  | nCell/pCur->pB
2ecc0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 70 43  t->usableSize>pC
2ecd0 75 72 2d 3e 70 42 74 2d 3e 6e 50 61 67 65 20 29  ur->pBt->nPage )
2ece0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2ecf0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2ed00 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
2ed10 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2ed20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2ed30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ed40 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
2ed50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
2ed60 43 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20  Cell+18 );.     
2ed70 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
2ed80 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
2ed90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2eda0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2edb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2edc0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2edd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ede0 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31    pCur->ix = (u1
2edf0 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2ee00 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
2ee10 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  oad(pCur, 0, nCe
2ee20 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  ll, (unsigned ch
2ee30 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29  ar*)pCellKey, 0)
2ee40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2ee50 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42  ->curFlags &= ~B
2ee60 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
2ee70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2ee80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2ee90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2eea0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  lKey);.         
2eeb0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2eec0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2eed0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d   }.          c =
2eee0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
2eef0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c  rdCompare(nCell,
2ef00 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b   pCellKey, pIdxK
2ef10 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ey);.          s
2ef20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c  qlite3_free(pCel
2ef30 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  lKey);.        }
2ef40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2ef50 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
2ef60 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21  IdxKey->errCode!
2ef70 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
2ef80 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20  || c==0).       
2ef90 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65    && (pIdxKey->e
2efa0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e  rrCode!=SQLITE_N
2efb0 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42  OMEM || pCur->pB
2efc0 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  tree->db->malloc
2efd0 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20  Failed).        
2efe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
2eff0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
2f000 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20  lwr = idx+1;.   
2f010 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
2f020 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2f030 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20  upr = idx-1;.   
2f040 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f050 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63 3d        assert( c=
2f060 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2f070 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2f080 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f090 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
2f0a0 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69  Cur->ix = (u16)i
2f0b0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2f0c0 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f  ( pIdxKey->errCo
2f0d0 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  de ) rc = SQLITE
2f0e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2f0f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2f100 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2f110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
2f120 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65  f( lwr>upr ) bre
2f130 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ak;.        asse
2f140 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2f150 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2f160 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2f170 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2f180 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  )/2 */.      }. 
2f190 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2f1a0 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28   lwr==upr+1 || (
2f1b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
2f1c0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29   !pPage->leaf) )
2f1d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2f1e0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
2f1f0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
2f200 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  af ){.      asse
2f210 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 43 75  rt( pCur->ix<pCu
2f220 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
2f230 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  );.      pCur->i
2f240 78 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  x = (u16)idx;.  
2f250 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
2f260 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2f270 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
2f280 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2f290 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
2f2a0 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
2f2b0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
2f2c0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
2f2d0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
2f2e0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2f2f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2f300 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f310 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2f320 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2f330 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
2f340 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2f350 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
2f360 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2f370 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
2f380 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2f390 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
2f3a0 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
2f3b0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
2f3c0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2f3d0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2f3e0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2f3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2f400 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2f410 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2f420 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2f430 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2f440 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2f450 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2f460 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2f470 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2f480 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2f490 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2f4a0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2f4b0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2f4c0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2f4d0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2f4e0 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2f4f0 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2f500 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2f510 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2f520 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2f530 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2f540 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2f550 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2f560 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2f570 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2f580 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2f590 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2f5a0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2f5b0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2f5c0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2f5d0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2f5e0 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2f5f0 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2f600 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2f610 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2f620 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2f630 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  ./*.** Return an
2f640 20 65 73 74 69 6d 61 74 65 20 66 6f 72 20 74 68   estimate for th
2f650 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
2f660 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74 68   in the table th
2f670 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 70 6f  at pCur is.** po
2f680 69 6e 74 69 6e 67 20 74 6f 2e 20 20 52 65 74 75  inting to.  Retu
2f690 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75  rn a negative nu
2f6a0 6d 62 65 72 20 69 66 20 6e 6f 20 65 73 74 69 6d  mber if no estim
2f6b0 61 74 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ate is currently
2f6c0 20 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a   .** available..
2f6d0 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
2f6e0 72 65 65 52 6f 77 43 6f 75 6e 74 45 73 74 28 42  reeRowCountEst(B
2f6f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2f700 20 20 69 36 34 20 6e 3b 0a 20 20 75 38 20 69 3b    i64 n;.  u8 i;
2f710 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2f720 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2f730 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2f740 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2f750 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2f760 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2f770 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79  ..  /* Currently
2f780 20 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20   this interface 
2f790 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
2f7a0 79 20 74 68 65 20 4f 50 5f 49 66 53 6d 61 6c 6c  y the OP_IfSmall
2f7b0 65 72 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 2c 20  er.  ** opcode, 
2f7c0 61 6e 64 20 69 74 20 74 68 61 74 20 63 61 73 65  and it that case
2f7d0 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6c 6c   the cursor will
2f7e0 20 61 6c 77 61 79 73 20 62 65 20 76 61 6c 69 64   always be valid
2f7f0 20 61 6e 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 61   and.  ** will a
2f800 6c 77 61 79 73 20 70 6f 69 6e 74 20 74 6f 20 61  lways point to a
2f810 20 6c 65 61 66 20 6e 6f 64 65 2e 20 2a 2f 0a 20   leaf node. */. 
2f820 20 69 66 28 20 4e 45 56 45 52 28 70 43 75 72 2d   if( NEVER(pCur-
2f830 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2f840 56 41 4c 49 44 29 20 29 20 72 65 74 75 72 6e 20  VALID) ) return 
2f850 2d 31 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28  -1;.  if( NEVER(
2f860 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6c 65 61  pCur->pPage->lea
2f870 66 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 2d  f==0) ) return -
2f880 31 3b 0a 0a 20 20 6e 20 3d 20 70 43 75 72 2d 3e  1;..  n = pCur->
2f890 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2f8a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 75 72 2d  for(i=0; i<pCur-
2f8b0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
2f8c0 20 20 6e 20 2a 3d 20 70 43 75 72 2d 3e 61 70 50    n *= pCur->apP
2f8d0 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c 6c 3b 0a 20  age[i]->nCell;. 
2f8e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
2f8f0 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
2f900 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
2f910 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20  e next entry in 
2f920 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
2f930 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 3a 0a  * Return value:.
2f940 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f  **.**    SQLITE_
2f950 4f 4b 20 20 20 20 20 20 20 20 73 75 63 63 65 73  OK        succes
2f960 73 0a 2a 2a 20 20 20 20 53 51 4c 49 54 45 5f 44  s.**    SQLITE_D
2f970 4f 4e 45 20 20 20 20 20 20 63 75 72 73 6f 72 20  ONE      cursor 
2f980 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  is already point
2f990 69 6e 67 20 61 74 20 74 68 65 20 6c 61 73 74 20  ing at the last 
2f9a0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20 20 20 6f 74  element.**    ot
2f9b0 68 65 72 77 69 73 65 20 20 20 20 20 20 20 20 73  herwise        s
2f9c0 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  ome kind of erro
2f9d0 72 20 6f 63 63 75 72 72 65 64 0a 2a 2a 0a 2a 2a  r occurred.**.**
2f9e0 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79 20   The main entry 
2f9f0 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65 33  point is sqlite3
2fa00 42 74 72 65 65 4e 65 78 74 28 29 2e 20 20 54 68  BtreeNext().  Th
2fa10 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2fa20 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2fa30 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2fa40 66 20 6d 65 72 65 6c 79 20 69 6e 63 72 65 6d 65  f merely increme
2fa50 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2fa60 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2fa70 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2fa80 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65  next cell on the
2fa90 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20   current page.  
2faa0 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72  The (slower) btr
2fab0 65 65 4e 65 78 74 28 29 20 68 65 6c 70 65 72 0a  eeNext() helper.
2fac0 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  ** routine is ca
2fad0 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2fae0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2faf0 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2fb00 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72   page or.** to r
2fb10 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2fb20 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 69 74 20  r..**.** If bit 
2fb30 30 78 30 31 20 6f 66 20 74 68 65 20 46 20 61 72  0x01 of the F ar
2fb40 67 75 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  gument in sqlite
2fb50 33 42 74 72 65 65 4e 65 78 74 28 43 2c 46 29 20  3BtreeNext(C,F) 
2fb60 69 73 20 31 2c 20 74 68 65 6e 20 74 68 65 0a 2a  is 1, then the.*
2fb70 2a 20 63 75 72 73 6f 72 20 63 6f 72 72 65 73 70  * cursor corresp
2fb80 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69  onds to an SQL i
2fb90 6e 64 65 78 20 61 6e 64 20 74 68 69 73 20 72 6f  ndex and this ro
2fba0 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2fbb0 20 62 65 65 6e 0a 2a 2a 20 73 6b 69 70 70 65 64   been.** skipped
2fbc0 20 69 66 20 74 68 65 20 53 51 4c 20 69 6e 64 65   if the SQL inde
2fbd0 78 20 68 61 64 20 62 65 65 6e 20 61 20 75 6e 69  x had been a uni
2fbe0 71 75 65 20 69 6e 64 65 78 2e 20 20 54 68 65 20  que index.  The 
2fbf0 46 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  F argument.** is
2fc00 20 61 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69   a hint to the i
2fc10 6d 70 6c 65 6d 65 6e 74 2e 20 20 53 51 4c 69 74  mplement.  SQLit
2fc20 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2fc30 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  tation does not 
2fc40 75 73 65 0a 2a 2a 20 74 68 69 73 20 68 69 6e 74  use.** this hint
2fc50 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64 6f 65  , but COMDB2 doe
2fc60 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  s..*/.static SQL
2fc70 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
2fc80 20 62 74 72 65 65 4e 65 78 74 28 42 74 43 75 72   btreeNext(BtCur
2fc90 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2fca0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2fcb0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2fcc0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2fcd0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2fce0 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20  (pCur) );.  if( 
2fcf0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2fd00 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2fd10 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2fd20 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2fd30 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29  _ValidOvfl)==0 )
2fd40 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74 6f  ;.    rc = resto
2fd50 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2fd60 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20  (pCur);.    if( 
2fd70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fd80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2fd90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2fda0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d  CURSOR_INVALID==
2fdb0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
2fdc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2fdd0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
2fde0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
2fdf0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2fe00 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 20 20 70  PNEXT ){.      p
2fe10 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2fe20 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2fe30 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2fe40 4e 65 78 74 3e 30 20 29 20 72 65 74 75 72 6e 20  Next>0 ) return 
2fe50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2fe60 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2fe70 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
2fe80 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e 69 78 3b  dx = ++pCur->ix;
2fe90 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
2fea0 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 2f 2a 20  sInit ){.    /* 
2feb0 54 68 65 20 6f 6e 6c 79 20 6b 6e 6f 77 6e 20 77  The only known w
2fec0 61 79 20 66 6f 72 20 74 68 69 73 20 74 6f 20 68  ay for this to h
2fed0 61 70 70 65 6e 20 69 73 20 66 6f 72 20 74 68 65  appen is for the
2fee0 72 65 20 74 6f 20 62 65 20 61 0a 20 20 20 20 2a  re to be a.    *
2fef0 2a 20 72 65 63 75 72 73 69 76 65 20 53 51 4c 20  * recursive SQL 
2ff00 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 64 6f  function that do
2ff10 65 73 20 61 20 44 45 4c 45 54 45 20 6f 70 65 72  es a DELETE oper
2ff20 61 74 69 6f 6e 20 61 73 20 70 61 72 74 20 6f 66  ation as part of
2ff30 20 61 0a 20 20 20 20 2a 2a 20 53 45 4c 45 43 54   a.    ** SELECT
2ff40 20 77 68 69 63 68 20 64 65 6c 65 74 65 73 20 63   which deletes c
2ff50 6f 6e 74 65 6e 74 20 6f 75 74 20 66 72 6f 6d 20  ontent out from 
2ff60 75 6e 64 65 72 20 61 6e 20 61 63 74 69 76 65 20  under an active 
2ff70 63 75 72 73 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  cursor.    ** in
2ff80 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
2ff90 61 73 65 20 66 69 6c 65 20 77 68 65 72 65 20 74  ase file where t
2ffa0 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 44  he table being D
2ffb0 45 4c 45 54 45 2d 65 64 20 66 72 6f 6d 0a 20 20  ELETE-ed from.  
2ffc0 20 20 2a 2a 20 68 61 73 20 70 61 67 65 73 20 69    ** has pages i
2ffd0 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 74 68  n common with th
2ffe0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 71 75  e table being qu
2fff0 65 72 69 65 64 2e 20 20 53 65 65 20 54 48 33 0a  eried.  See TH3.
30000 20 20 20 20 2a 2a 20 6d 6f 64 75 6c 65 20 63 6f      ** module co
30010 76 31 2f 62 74 72 65 65 37 38 2e 74 65 73 74 20  v1/btree78.test 
30020 74 65 73 74 63 61 73 65 20 32 32 30 20 28 32 30  testcase 220 (20
30030 31 38 2d 30 36 2d 30 38 29 20 66 6f 72 20 61 6e  18-06-08) for an
30040 0a 20 20 20 20 2a 2a 20 65 78 61 6d 70 6c 65 2e  .    ** example.
30050 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
30060 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
30070 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  PT;.  }..  /* If
30080 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30090 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
300a0 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
300b0 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
300c0 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
300d0 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
300e0 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
300f0 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
30100 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
30110 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
30120 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
30130 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
30140 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
30150 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
30160 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
30170 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
30180 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
30190 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
301a0 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
301b0 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
301c0 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
301d0 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
301e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
301f0 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
30200 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
30210 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
30220 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
30230 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
30240 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
30250 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
30260 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
30270 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
30280 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
30290 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
302a0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
302b0 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
302c0 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
302d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  =0 ){.        pC
302e0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
302f0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20  SOR_INVALID;.   
30300 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30310 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
30320 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
30330 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ent(pCur);.     
30340 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
30350 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65  Page;.    }while
30360 28 20 70 43 75 72 2d 3e 69 78 3e 3d 70 50 61 67  ( pCur->ix>=pPag
30370 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
30380 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
30390 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
303a0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
303b0 78 74 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 20  xt(pCur, 0);.   
303c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
303d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
303e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
303f0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
30400 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30410 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
30420 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c    return moveToL
30430 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
30440 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33   }.}.int sqlite3
30450 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72 73  BtreeNext(BtCurs
30460 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c  or *pCur, int fl
30470 61 67 73 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ags){.  MemPage 
30480 2a 70 50 61 67 65 3b 0a 20 20 55 4e 55 53 45 44  *pPage;.  UNUSED
30490 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
304a0 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
304b0 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
304c0 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
304d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
304e0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
304f0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
30500 20 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61   flags==0 || fla
30510 67 73 3d 3d 31 20 29 3b 0a 20 20 70 43 75 72 2d  gs==1 );.  pCur-
30520 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
30530 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
30540 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
30550 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
30560 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20 70 43 75  Ovfl);.  if( pCu
30570 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
30580 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
30590 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 29   btreeNext(pCur)
305a0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
305b0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 28  ->pPage;.  if( (
305c0 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d 70 50 61  ++pCur->ix)>=pPa
305d0 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
305e0 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20   pCur->ix--;.   
305f0 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65 78   return btreeNex
30600 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 69  t(pCur);.  }.  i
30610 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
30620 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
30630 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
30640 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
30650 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
30660 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
30670 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
30680 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
30690 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
306a0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
306b0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c 75  ..** Return valu
306c0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51  es:.**.**     SQ
306d0 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73 75 63 63  LITE_OK     succ
306e0 65 73 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  ess.**     SQLIT
306f0 45 5f 44 4f 4e 45 20 20 20 74 68 65 20 63 75 72  E_DONE   the cur
30700 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 6f  sor is already o
30710 6e 20 74 68 65 20 66 69 72 73 74 20 65 6c 65 6d  n the first elem
30720 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
30730 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72 77 69 73  .**     otherwis
30740 65 20 20 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20  e     some kind 
30750 6f 66 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  of error occurre
30760 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e  d.**.** The main
30770 20 65 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20   entry point is 
30780 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
30790 69 6f 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f  ious().  That ro
307a0 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
307b0 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
307c0 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
307d0 65 6c 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67  ely decrementing
307e0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
307f0 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
30800 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69  .** to the previ
30810 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20  ous cell on the 
30820 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54  current page.  T
30830 68 65 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65  he (slower) btre
30840 65 50 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68  ePrevious().** h
30850 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73  elper routine is
30860 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
30870 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
30880 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
30890 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74  ent page.** or t
308a0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
308b0 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62  rsor..**.** If b
308c0 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20 46  it 0x01 of the F
308d0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73 71 6c   argument to sql
308e0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
308f0 73 28 43 2c 46 29 20 69 73 20 31 2c 20 74 68 65  s(C,F) is 1, the
30900 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  n.** the cursor 
30910 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61  corresponds to a
30920 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 20  n SQL index and 
30930 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
30940 6c 64 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20  ld have been.** 
30950 73 6b 69 70 70 65 64 20 69 66 20 74 68 65 20 53  skipped if the S
30960 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65  QL index had bee
30970 6e 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78  n a unique index
30980 2e 20 20 54 68 65 20 46 20 61 72 67 75 6d 65 6e  .  The F argumen
30990 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e 74 20 74  t is a.** hint t
309a0 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e  o the implement.
309b0 20 20 54 68 65 20 6e 61 74 69 76 65 20 53 51 4c    The native SQL
309c0 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
309d0 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
309e0 74 0a 2a 2a 20 75 73 65 20 74 68 69 73 20 68 69  t.** use this hi
309f0 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32 20 64  nt, but COMDB2 d
30a00 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  oes..*/.static S
30a10 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
30a20 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
30a30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
30a40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
30a50 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
30a60 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
30a70 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
30a80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ) );.  assert( (
30a90 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30aa0 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
30ab0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
30ac0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
30ad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
30ae0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
30af0 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
30b00 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30b10 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
30b20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
30b30 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
30b40 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30b50 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
30b60 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
30b70 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
30b80 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
30b90 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ate ){.      ret
30ba0 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
30bb0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43  .    }.    if( C
30bc0 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d  URSOR_SKIPNEXT==
30bd0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCur->eState ){.
30be0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
30bf0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
30c00 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
30c10 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 20  r->skipNext<0 ) 
30c20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30c30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
30c40 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
30c50 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
30c60 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
30c70 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30c80 66 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78  f ){.    int idx
30c90 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20 20   = pCur->ix;.   
30ca0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
30cb0 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
30cc0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
30cd0 20 69 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28   idx)));.    if(
30ce0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30cf0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
30d00 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
30d10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
30d20 69 6c 65 28 20 70 43 75 72 2d 3e 69 78 3d 3d 30  ile( pCur->ix==0
30d30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
30d40 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a  ur->iPage==0 ){.
30d50 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
30d60 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
30d70 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
30d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
30d90 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
30da0 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
30db0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ur);.    }.    a
30dc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66  ssert( pCur->inf
30dd0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  o.nSize==0 );.  
30de0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
30df0 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
30e00 46 5f 56 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30  F_ValidOvfl))==0
30e10 20 29 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 69   );..    pCur->i
30e20 78 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d  x--;.    pPage =
30e30 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
30e40 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
30e50 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
30e60 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
30e70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
30e80 65 76 69 6f 75 73 28 70 43 75 72 2c 20 30 29 3b  evious(pCur, 0);
30e90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30ea0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
30eb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
30ec0 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73  turn rc;.}.int s
30ed0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
30ee0 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
30ef0 75 72 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  ur, int flags){.
30f00 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
30f10 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
30f20 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
30f30 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
30f40 73 3d 3d 31 20 29 3b 0a 20 20 55 4e 55 53 45 44  s==1 );.  UNUSED
30f50 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c 61 67  _PARAMETER( flag
30f60 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20 69 6e  s );  /* Used in
30f70 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f 74 20   COMDB2 but not 
30f80 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20 2a 2f  native SQLite */
30f90 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
30fa0 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61  s &= ~(BTCF_AtLa
30fb0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
30fc0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
30fd0 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
30fe0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28  nSize = 0;.  if(
30ff0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
31000 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c  URSOR_VALID.   |
31010 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a 20 20  | pCur->ix==0.  
31020 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67 65 2d   || pCur->pPage-
31030 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a 20 20  >leaf==0.  ){.  
31040 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50 72    return btreePr
31050 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a 20 20  evious(pCur);.  
31060 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a  }.  pCur->ix--;.
31070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
31080 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
31090 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
310a0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
310b0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
310c0 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
310d0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
310e0 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
310f0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
31100 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
31110 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
31120 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
31130 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
31140 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
31150 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
31160 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
31170 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
31180 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
31190 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
311a0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
311b0 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
311c0 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
311d0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
311e0 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
311f0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
31200 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
31210 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
31220 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
31230 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
31240 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
31250 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
31260 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
31270 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
31280 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
31290 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
312a0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
312b0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
312c0 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
312d0 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
312e0 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
312f0 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
31300 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
31310 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
31320 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
31330 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
31340 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
31350 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
31360 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
31370 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
31380 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
31390 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
313a0 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
313b0 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
313c0 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
313d0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
313e0 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
313f0 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
31400 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
31410 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
31420 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
31430 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
31440 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
31450 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
31460 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
31470 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
31480 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
31490 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
314a0 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
314b0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
314c0 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
314d0 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
314e0 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
314f0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
31500 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
31510 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
31520 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31530 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
31540 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
31550 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
31560 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
31570 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
31580 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
31590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
315a0 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
315b0 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
315c0 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
315d0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
315e0 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
315f0 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
31600 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
31610 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
31620 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
31630 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
31640 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
31650 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
31660 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
31670 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
31680 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
31690 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
316a0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
316b0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
316c0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
316d0 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
316e0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
316f0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31700 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
31710 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31720 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
31730 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
31740 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
31750 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
31760 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
31770 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
31780 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
31790 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
317a0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
317b0 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
317c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
317d0 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
317e0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
317f0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
31800 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
31810 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
31820 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
31830 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31840 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
31850 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31860 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
31870 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
31880 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
31890 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
318a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
318b0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
318c0 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
318d0 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
318e0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
318f0 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
31900 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
31910 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
31920 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
31930 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
31940 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
31950 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
31960 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
31970 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
31980 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
31990 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
319a0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
319b0 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
319c0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
319d0 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
319e0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
319f0 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
31a00 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
31a10 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
31a20 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
31a30 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
31a40 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
31a50 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
31a60 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
31a70 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
31a80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
31a90 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
31aa0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31ab0 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
31ac0 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
31ad0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
31ae0 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
31af0 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
31b00 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
31b10 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
31b20 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
31b30 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
31b40 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
31b50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
31b60 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31b70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
31b80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
31b90 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
31ba0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
31bb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31bc0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
31bd0 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
31be0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
31bf0 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
31c00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
31c10 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
31c20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
31c30 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
31c40 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
31c50 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
31c60 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
31c70 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
31c80 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
31c90 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
31ca0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31cb0 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
31cc0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31cd0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
31ce0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
31cf0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
31d00 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
31d10 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
31d20 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
31d30 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
31d40 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
31d50 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
31d60 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
31d70 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
31d80 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
31d90 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
31da0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
31db0 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
31dc0 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
31dd0 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
31de0 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
31df0 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
31e00 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
31e10 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
31e20 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
31e30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
31e40 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
31e50 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
31e60 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
31e70 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
31e80 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
31e90 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
31ea0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
31eb0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31ec0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
31ed0 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
31ee0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
31ef0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
31f00 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
31f10 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
31f20 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
31f30 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
31f40 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
31f50 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
31f60 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
31f70 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
31f80 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
31f90 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
31fa0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
31fb0 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
31fc0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
31fd0 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
31fe0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
31ff0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
32000 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
32010 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
32020 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
32030 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
32040 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
32050 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
32060 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
32070 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
32080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32090 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
320a0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
320b0 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
320c0 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
320d0 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
320e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
320f0 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76 54 72  UPT_PGNO(pPrevTr
32100 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75 6e 6b  unk ? pPrevTrunk
32110 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20 20 20  ->pgno : 1);.   
32120 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32130 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
32140 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
32150 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20  Trunk, &pTrunk, 
32160 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
32170 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
32180 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
32190 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
321a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
321b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
321c0 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20  sert( pTrunk!=0 
321d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
321e0 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d   pTrunk->aData!=
321f0 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56  0 );.      /* EV
32200 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35  IDENCE-OF: R-135
32210 32 33 2d 30 34 33 39 34 20 54 68 65 20 73 65 63  23-04394 The sec
32220 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  ond integer on a
32230 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
32240 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  page.      ** is
32250 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
32260 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72  eaf page pointer
32270 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a  s to follow. */.
32280 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79        k = get4by
32290 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
322a0 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  a[4]);.      if(
322b0 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68   k==0 && !search
322c0 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
322d0 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73  /* The trunk has
322e0 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74   no leaves and t
322f0 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62  he list is not b
32300 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a  eing searched. .
32310 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78          ** So ex
32320 74 72 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20  tract the trunk 
32330 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20  page itself and 
32340 75 73 65 20 69 74 20 61 73 20 74 68 65 20 6e 65  use it as the ne
32350 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  wly .        ** 
32360 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a  allocated page *
32370 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
32380 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20  ( pPrevTrunk==0 
32390 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
323a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
323b0 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
323c0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
323d0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
323e0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
323f0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
32400 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f  }.        *pPgno
32410 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = iTrunk;.     
32420 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
32430 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
32440 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
32450 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70   4);.        *pp
32460 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
32470 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
32480 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
32490 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
324a0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
324b0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
324c0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20  pPgno, n-1));.  
324d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
324e0 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c  (u32)(pBt->usabl
324f0 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a  eSize/4 - 2) ){.
32500 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
32510 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
32520 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
32530 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
32540 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
32550 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e 4f 28  TE_CORRUPT_PGNO(
32560 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  iTrunk);.       
32570 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
32580 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66  te_page;.#ifndef
32590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
325a0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65  OVACUUM.      }e
325b0 6c 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69  lse if( searchLi
325c0 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  st .            
325d0 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54 72 75  && (nearby==iTru
325e0 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65  nk || (iTrunk<ne
325f0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
32600 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
32610 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
32620 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69   The list is bei
32630 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20  ng searched and 
32640 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20  this trunk page 
32650 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  is the page.    
32660 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61      ** to alloca
32670 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  te, regardless o
32680 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73  f whether it has
32690 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20   leaves..       
326a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70 50 67   */.        *pPg
326b0 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
326c0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
326d0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73  Trunk;.        s
326e0 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20  earchList = 0;. 
326f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32700 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32710 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32720 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
32730 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
32740 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32750 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
32760 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29        if( k==0 )
32770 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
32780 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
32790 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
327a0 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  y(&pPage1->aData
327b0 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  [32], &pTrunk->a
327c0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
327d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
327e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
327f0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
32800 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
32810 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
32820 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32830 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
32840 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
32850 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
32860 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32870 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
32880 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32890 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
328a0 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
328b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
328c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
328d0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
328e0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
328f0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
32900 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
32910 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
32920 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
32930 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
32940 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
32950 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
32960 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
32970 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
32980 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
32990 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
329a0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
329b0 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
329c0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
329d0 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
329e0 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 54 72        if( iNewTr
329f0 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20  unk>mxPage ){ . 
32a00 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
32a10 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
32a20 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20  GNO(iTrunk);.   
32a30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
32a40 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
32a50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
32a60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32a70 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61   iNewTrunk==mxPa
32a80 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ge );.          
32a90 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
32aa0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65  sedPage(pBt, iNe
32ab0 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75  wTrunk, &pNewTru
32ac0 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nk, 0);.        
32ad0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
32af0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
32b00 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
32b30 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e  erWrite(pNewTrun
32b40 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
32b50 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
32b60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32b70 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
32b80 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
32b90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
32ba0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
32bb0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ge;.          }.
32bc0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
32bd0 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32be0 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[0], &pTrunk->
32bf0 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20  aData[0], 4);.  
32c00 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
32c10 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
32c20 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20  ta[4], k-1);.   
32c30 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
32c40 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
32c50 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  8], &pTrunk->aDa
32c60 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29  ta[12], (k-1)*4)
32c70 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  ;.          rele
32c80 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e  asePage(pNewTrun
32c90 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  k);.          if
32ca0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
32cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
32cc0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
32cd0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
32ce0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ge1->pDbPage) );
32cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
32d00 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
32d10 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72  Data[32], iNewTr
32d20 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
32d30 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
32d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32d50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76 54  agerWrite(pPrevT
32d60 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32d70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
32d80 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
32d90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
32da0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
32db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32dc0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
32dd0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
32de0 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  a[0], iNewTrunk)
32df0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
32e00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32e10 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
32e20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
32e30 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d  CATE: %d trunk -
32e40 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20 6c   %d free pages l
32e50 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20  eft\n", *pPgno, 
32e60 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  n-1));.#endif.  
32e70 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e      }else if( k>
32e80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
32e90 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20 66  Extract a leaf f
32ea0 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f  rom the trunk */
32eb0 0a 20 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f  .        u32 clo
32ec0 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67  sest;.        Pg
32ed0 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20  no iPage;.      
32ee0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
32ef0 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d  *aData = pTrunk-
32f00 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20  >aData;.        
32f10 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
32f20 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69 3b            u32 i;
32f30 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
32f40 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
32f50 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41    if( eMode==BTA
32f60 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20  LLOC_LE ){.     
32f70 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
32f80 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<k; i++){.     
32f90 20 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d           iPage =
32fa0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
32fb0 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20  [8+i*4]);.      
32fc0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
32fd0 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e<=nearby ){.   
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
32ff0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
33000 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
33010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
33020 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
33030 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
33040 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
33050 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  dist;.          
33060 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33    dist = sqlite3
33070 41 62 73 49 6e 74 33 32 28 67 65 74 34 62 79 74  AbsInt32(get4byt
33080 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e  e(&aData[8]) - n
33090 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20  earby);.        
330a0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
330b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
330c0 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73        int d2 = s
330d0 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67  qlite3AbsInt32(g
330e0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
330f0 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29  +i*4]) - nearby)
33100 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
33110 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
33120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
33130 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
33140 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
33150 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
33160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33170 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
33180 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33190 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
331a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
331b0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
331c0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
331d0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
331e0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
331f0 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65  e( iPage==mxPage
33200 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
33210 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a  iPage>mxPage ){.
33220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
33230 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47  QLITE_CORRUPT_PG
33240 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20  NO(iTrunk);.    
33250 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
33260 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
33270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33280 74 65 73 74 63 61 73 65 28 20 69 50 61 67 65 3d  testcase( iPage=
33290 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
332a0 20 20 20 69 66 28 20 21 73 65 61 72 63 68 4c 69     if( !searchLi
332b0 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  st .         || 
332c0 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c  (iPage==nearby |
332d0 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62 79 20  | (iPage<nearby 
332e0 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  && eMode==BTALLO
332f0 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20 20 20  C_LE)) .        
33300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
33310 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
33320 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
33330 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
33340 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
33350 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20 25 64  : %d was leaf %d
33360 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20   of %d on trunk 
33370 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  %d".            
33380 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20       ": %d more 
33390 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20  free pages\n",. 
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333b0 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b  *pPgno, closest+
333c0 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  1, k, pTrunk->pg
333d0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
333e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
333f0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
33400 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
33410 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
33420 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
33430 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
33440 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
33450 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
33460 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
33470 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
33480 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
33490 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
334a0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
334b0 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
334c0 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e  .          noCon
334d0 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47 65 74  tent = !btreeGet
334e0 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20  HasContent(pBt, 
334f0 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47  *pPgno)? PAGER_G
33500 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30  ET_NOCONTENT : 0
33510 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
33520 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
33530 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
33540 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
33550 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nt);.          i
33560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33570 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
33580 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
33590 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29  rWrite((*ppPage)
335a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
335b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
335c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
335d0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
335e0 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
335f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  .              *
33600 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
33610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33620 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
33630 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a  searchList = 0;.
33640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33650 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  }.      releaseP
33660 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
33670 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
33680 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  k = 0;.    }whil
33690 65 28 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b  e( searchList );
336a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
336b0 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61   There are no pa
336c0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
336d0 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64 20 61  ist, so append a
336e0 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65   new page to the
336f0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
33700 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20   image..    **. 
33710 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20     ** Normally, 
33720 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f 63 61  new pages alloca
33730 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  ted by this bloc
33740 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65 73 74  k can be request
33750 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20 20 20  ed from the.    
33760 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72 20 77  ** pager layer w
33770 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74  ith the 'no-cont
33780 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54  ent' flag set. T
33790 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 68 65  his prevents the
337a0 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 72   pager.    ** fr
337b0 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72 65 61  om trying to rea
337c0 64 20 74 68 65 20 70 61 67 65 73 20 63 6f 6e 74  d the pages cont
337d0 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48  ent from disk. H
337e0 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 0a 20  owever, if the. 
337f0 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 74 72     ** current tr
33800 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
33810 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72  ready run one or
33820 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e 74 61   more incrementa
33830 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20  l-vacuum.    ** 
33840 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68 65 20  steps, then the 
33850 70 61 67 65 20 77 65 20 61 72 65 20 61 62 6f 75  page we are abou
33860 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61  t to allocate ma
33870 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e  y contain conten
33880 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73  t.    ** that is
33890 20 72 65 71 75 69 72 65 64 20 69 6e 20 74 68 65   required in the
338a0 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c   event of a roll
338b0 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20 63 61  back. In this ca
338c0 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f  se, do.    ** no
338d0 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e  t set the no-con
338e0 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69 73 20  tent flag. This 
338f0 63 61 75 73 65 73 20 74 68 65 20 70 61 67 65 72  causes the pager
33900 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75   to load and jou
33910 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20  rnal.    ** the 
33920 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
33930 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76 65 72  tent before over
33940 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
33950 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  **.    ** Note t
33960 68 61 74 20 74 68 65 20 70 61 67 65 72 20 77 69  hat the pager wi
33970 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ll not actually 
33980 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20  attempt to load 
33990 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20  or journal .    
339a0 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  ** content for a
339b0 6e 79 20 70 61 67 65 20 74 68 61 74 20 72 65 61  ny page that rea
339c0 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70 61 73  lly does lie pas
339d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
339e0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
339f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53   file on disk. S
33a00 6f 20 74 68 65 20 65 66 66 65 63 74 73 20 6f 66  o the effects of
33a10 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 20 6e   disabling the n
33a20 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69  o-content optimi
33a30 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65  zation.    ** he
33a40 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65 64 20  re are confined 
33a50 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20 74  to those pages t
33a60 68 61 74 20 6c 69 65 20 62 65 74 77 65 65 6e 20  hat lie between 
33a70 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
33a80 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
33a90 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65 6e 64  mage and the end
33aa0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33ab0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
33ac0 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74    int bNoContent
33ad0 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74   = (0==IfNotOmit
33ae0 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63  AV(pBt->bDoTrunc
33af0 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47 45 54  ate))? PAGER_GET
33b00 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20  _NOCONTENT:0;.. 
33b10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
33b20 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
33b30 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
33b40 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
33b50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 42 74  turn rc;.    pBt
33b60 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69  ->nPage++;.    i
33b70 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50  f( pBt->nPage==P
33b80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
33b90 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e 50 61  (pBt) ) pBt->nPa
33ba0 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ge++;..#ifndef S
33bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33bc0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
33bd0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
33be0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
33bf0 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 20  Bt, pBt->nPage) 
33c00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a  ){.      /* If *
33c10 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20  pPgno refers to 
33c20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
33c30 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f  ge, allocate two
33c40 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20 20 20   new pages.     
33c50 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f   ** at the end o
33c60 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65  f the file inste
33c70 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66  ad of one. The f
33c80 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70  irst allocated p
33c90 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63  age.      ** bec
33ca0 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74  omes a new point
33cb0 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65  er-map page, the
33cc0 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20   second is used 
33cd0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20  by the caller.. 
33ce0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65       */.      Me
33cf0 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a  mPage *pPg = 0;.
33d00 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
33d10 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
33d20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70 6f 69  end of file (poi
33d30 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e  nter-map page)\n
33d40 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b  ", pBt->nPage));
33d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
33d60 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49  Bt->nPage!=PENDI
33d70 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
33d80 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) );.      rc = 
33d90 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
33da0 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  ge(pBt, pBt->nPa
33db0 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e  ge, &pPg, bNoCon
33dc0 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  tent);.      if(
33dd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
33de0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
33df0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
33e00 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  (pPg->pDbPage);.
33e10 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
33e20 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
33e30 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
33e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
33e50 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
33e60 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e        if( pBt->n
33e70 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Page==PENDING_BY
33e80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 20  TE_PAGE(pBt) ){ 
33e90 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a  pBt->nPage++; }.
33ea0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
33eb0 20 70 75 74 34 62 79 74 65 28 32 38 20 2b 20 28   put4byte(28 + (
33ec0 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  u8*)pBt->pPage1-
33ed0 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61  >aData, pBt->nPa
33ee0 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20  ge);.    *pPgno 
33ef0 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20  = pBt->nPage;.. 
33f00 20 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e     assert( *pPgn
33f10 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o!=PENDING_BYTE_
33f20 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20  PAGE(pBt) );.   
33f30 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
33f40 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
33f50 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e  Pgno, ppPage, bN
33f60 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69  oContent);.    i
33f70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33f80 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
33f90 74 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a  te3PagerWrite((*
33fa0 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65  ppPage)->pDbPage
33fb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
33fc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
33fd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
33fe0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
33ff0 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
34000 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
34010 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
34020 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
34030 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
34040 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
34050 44 42 20 7c 7c 20 2a 70 50 67 6e 6f 21 3d 50 45  DB || *pPgno!=PE
34060 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
34070 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c  pBt) );..end_all
34080 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65  ocate_page:.  re
34090 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
340a0 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  );.  releasePage
340b0 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
340c0 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
340d0 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
340e0 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
340f0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
34100 50 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73  Page)<=1 );.  as
34110 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
34120 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29  _OK || (*ppPage)
34130 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20  ->isInit==0 );. 
34140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34150 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
34160 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64  on is used to ad
34170 64 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20  d page iPage to 
34180 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34190 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a  e free-list. .**
341a0 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
341b0 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
341c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61  not already a pa
341d0 72 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c  rt of the free-l
341e0 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ist..**.** The v
341f0 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
34200 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
34210 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
34220 69 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ion is optional.
34230 0a 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65  .** If the calle
34240 72 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76  r happens to hav
34250 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
34260 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63  he MemPage objec
34270 74 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  t .** correspond
34280 69 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67  ing to page iPag
34290 65 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20  e handy, it may 
342a0 70 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73  pass it as the s
342b0 65 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a  econd value. .**
342c0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d   Otherwise, it m
342d0 61 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a  ay pass NULL..**
342e0 0a 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72  .** If a pointer
342f0 20 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62   to a MemPage ob
34300 6a 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61  ject is passed a
34310 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
34320 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65  ument,.** its re
34330 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
34340 20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20   not altered by 
34350 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
34360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
34370 65 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20  ePage2(BtShared 
34380 2a 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70  *pBt, MemPage *p
34390 4d 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50  MemPage, Pgno iP
343a0 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
343b0 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20  *pTrunk = 0;    
343c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
343d0 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
343e0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54  age */.  Pgno iT
343f0 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34410 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
34420 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
34430 61 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67  age */ .  MemPag
34440 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
34450 3e 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a  >pPage1;      /*
34460 20 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65   Local reference
34470 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   to page 1 */.  
34480 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20  MemPage *pPage; 
34490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
344a0 20 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e      /* Page bein
344b0 67 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20  g freed. May be 
344c0 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  NULL. */.  int r
344d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
344e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
344f0 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
34500 0a 20 20 75 33 32 20 6e 46 72 65 65 3b 20 20 20  .  u32 nFree;   
34510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34520 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
34530 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
34540 73 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a  s on free-list *
34550 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
34560 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
34570 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
34580 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
34590 5f 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29  _DB || iPage>1 )
345a0 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65  ;.  assert( !pMe
345b0 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67  mPage || pMemPag
345c0 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29  e->pgno==iPage )
345d0 3b 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32  ;..  if( iPage<2
345e0 20 7c 7c 20 69 50 61 67 65 3e 70 42 74 2d 3e 6e   || iPage>pBt->n
345f0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
34600 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
34610 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
34620 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a 20 20  ( pMemPage ){.  
34630 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d 50 61    pPage = pMemPa
34640 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ge;.    sqlite3P
34650 61 67 65 72 52 65 66 28 70 50 61 67 65 2d 3e 70  agerRef(pPage->p
34660 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65  DbPage);.  }else
34670 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 62 74  {.    pPage = bt
34680 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70 42  reePageLookup(pB
34690 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  t, iPage);.  }..
346a0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
346b0 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
346c0 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
346d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
346e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
346f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
34700 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
34710 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72 65 65  age_out;.  nFree
34720 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
34730 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
34740 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
34750 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
34760 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69 66 28  nFree+1);..  if(
34770 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
34780 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
34790 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  TE ){.    /* If 
347a0 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74  the secure_delet
347b0 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62  e option is enab
347c0 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a  led, then.    **
347d0 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f 76   always fully ov
347e0 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
347f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
34800 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
34810 20 20 20 69 66 28 20 28 21 70 50 61 67 65 20 26     if( (!pPage &
34820 26 20 28 28 72 63 20 3d 20 62 74 72 65 65 47 65  & ((rc = btreeGe
34830 74 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65  tPage(pBt, iPage
34840 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30  , &pPage, 0))!=0
34850 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20 20 20  ) ).     ||     
34860 20 20 20 20 20 20 20 28 28 72 63 20 3d 20 73 71         ((rc = sq
34870 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34880 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
34890 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  !=0).    ){.    
348a0 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
348b0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  out;.    }.    m
348c0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
348d0 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70 42  ta, 0, pPage->pB
348e0 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
348f0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64  }..  /* If the d
34900 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
34910 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72   auto-vacuum, wr
34920 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  ite an entry in 
34930 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
34940 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65    ** to indicate
34950 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
34960 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69  s free..  */.  i
34970 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
34980 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74  ){.    ptrmapPut
34990 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52  (pBt, iPage, PTR
349a0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
349b0 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 72   &rc);.    if( r
349c0 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70 61 67  c ) goto freepag
349d0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e_out;.  }..  /*
349e0 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74 65 20   Now manipulate 
349f0 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
34a00 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20 73 74  ase free-list st
34a10 72 75 63 74 75 72 65 2e 20 54 68 65 72 65 20 61  ructure. There a
34a20 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f 73 73  re two.  ** poss
34a30 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20 74 68  ibilities. If th
34a40 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 63  e free-list is c
34a50 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79 2c 20  urrently empty, 
34a60 6f 72 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  or if the first.
34a70 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20    ** trunk page 
34a80 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
34a90 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e 20 74   is full, then t
34aa0 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20 62 65  his page will be
34ab0 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65 77 20  come a.  ** new 
34ac0 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20  free-list trunk 
34ad0 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  page. Otherwise,
34ae0 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20   it will become 
34af0 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a 20 20  a leaf of the.  
34b00 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ** first trunk p
34b10 61 67 65 20 69 6e 20 74 68 65 20 63 75 72 72 65  age in the curre
34b20 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  nt free-list. Th
34b30 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 69  is block tests i
34b40 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  f it.  ** is pos
34b50 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
34b60 20 70 61 67 65 20 61 73 20 61 20 6e 65 77 20 66   page as a new f
34b70 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e 0a 20  ree-list leaf.. 
34b80 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65 65 21   */.  if( nFree!
34b90 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4c  =0 ){.    u32 nL
34ba0 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  eaf;            
34bb0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
34bc0 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 63 65  umber of leaf ce
34bd0 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  lls on trunk pag
34be0 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75 6e 6b  e */..    iTrunk
34bf0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
34c00 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
34c10 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
34c20 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
34c30 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
34c40 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
34c50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34c60 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34c70 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c  t;.    }..    nL
34c80 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26  eaf = get4byte(&
34c90 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
34ca0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
34cb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3e 33  Bt->usableSize>3
34cc0 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  2 );.    if( nLe
34cd0 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d 3e 75  af > (u32)pBt->u
34ce0 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
34cf0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
34d00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34d10 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  T;.      goto fr
34d20 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
34d30 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20  }.    if( nLeaf 
34d40 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62  < (u32)pBt->usab
34d50 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a  leSize/4 - 8 ){.
34d60 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 69 73        /* In this
34d70 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20 72   case there is r
34d80 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b  oom on the trunk
34d90 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72 74 20   page to insert 
34da0 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 2a  the page.      *
34db0 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73  * being freed as
34dc0 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20   a new leaf..   
34dd0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e     **.      ** N
34de0 6f 74 65 20 74 68 61 74 20 74 68 65 20 74 72 75  ote that the tru
34df0 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74 20 72  nk page is not r
34e00 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c  eally full until
34e10 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20   it contains.   
34e20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65     ** usableSize
34e30 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73 2c 20  /4 - 2 entries, 
34e40 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65 2f 34  not usableSize/4
34e50 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61 73 20   - 8 entries as 
34e60 77 65 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  we have.      **
34e70 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64 75 65   coded.  But due
34e80 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72 72   to a coding err
34e90 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f  or in versions o
34ea0 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72 20 74  f SQLite prior t
34eb0 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30  o.      ** 3.6.0
34ec0 2c 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  , databases with
34ed0 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
34ee0 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f  pages holding mo
34ef0 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a  re than.      **
34f00 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
34f10 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c 20 62  8 entries will b
34f20 65 20 72 65 70 6f 72 74 65 64 20 61 73 20 63 6f  e reported as co
34f30 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64 65 72  rrupt.  In order
34f40 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69  .      ** to mai
34f50 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64 73 20  ntain backwards 
34f60 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69  compatibility wi
34f70 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  th older version
34f80 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20 20 20  s of SQLite,.   
34f90 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f     ** we will co
34fa0 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74 72 69  ntinue to restri
34fb0 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ct the number of
34fc0 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61 62   entries to usab
34fd0 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20 20  leSize/4 - 8.   
34fe0 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20 20     ** for now.  
34ff0 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e  At some point in
35000 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e 63   the future (onc
35010 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20 75  e everyone has u
35020 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a 2a  pgraded.      **
35030 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61 74   to 3.6.0 or lat
35040 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63 6f  er) we should co
35050 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74 68  nsider fixing th
35060 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62  e conditional ab
35070 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ove.      ** to 
35080 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a 65  read "usableSize
35090 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f 66  /4-2" instead of
350a0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38   "usableSize/4-8
350b0 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  "..      **.    
350c0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
350d0 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37 36 20  : R-19920-11576 
350e0 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72 20 76  However, newer v
350f0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
35100 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  e still.      **
35110 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74 68 65   avoid using the
35120 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72 69 65   last six entrie
35130 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s in the freelis
35140 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61 72 72  t trunk page arr
35150 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6f  ay in.      ** o
35160 72 64 65 72 20 74 68 61 74 20 64 61 74 61 62 61  rder that databa
35170 73 65 20 66 69 6c 65 73 20 63 72 65 61 74 65 64  se files created
35180 20 62 79 20 6e 65 77 65 72 20 76 65 72 73 69 6f   by newer versio
35190 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e  ns of SQLite can
351a0 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   be.      ** rea
351b0 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72 73 69  d by older versi
351c0 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e 0a 20  ons of SQLite.. 
351d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
351e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
351f0 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
35200 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
35210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35220 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
35230 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
35240 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
35250 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
35260 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
35270 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
35280 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
35290 70 50 61 67 65 20 26 26 20 28 70 42 74 2d 3e 62  pPage && (pBt->b
352a0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
352b0 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20  CURE_DELETE)==0 
352c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
352d0 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69  ite3PagerDontWri
352e0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
352f0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
35300 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
35310 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  SetHasContent(pB
35320 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  t, iPage);.     
35330 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28   }.      TRACE((
35340 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c  "FREE-PAGE: %d l
35350 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67  eaf on trunk pag
35360 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70  e %d\n",pPage->p
35370 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f  gno,pTrunk->pgno
35380 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  ));.      goto f
35390 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
353a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
353b0 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20 74 6f  control flows to
353c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
353d0 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70 6f 73  n it was not pos
353e0 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74 68 65  sible to add the
353f0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 62  .  ** the page b
35400 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
35410 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74 68 65  leaf page of the
35420 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e 20   first trunk in 
35430 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20  the free-list.. 
35440 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62 65 63   ** Possibly bec
35450 61 75 73 65 20 74 68 65 20 66 72 65 65 2d 6c 69  ause the free-li
35460 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f 72 20  st is empty, or 
35470 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65  possibly because
35480 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72 73 74   the .  ** first
35490 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
354a0 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2e  ee-list is full.
354b0 20 45 69 74 68 65 72 20 77 61 79 2c 20 74 68 65   Either way, the
354c0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
354d0 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 63 6f  d.  ** will beco
354e0 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72 73 74  me the new first
354f0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
35500 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 20 20  he free-list..  
35510 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 3d 3d  */.  if( pPage==
35520 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  0 && SQLITE_OK!=
35530 28 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61  (rc = btreeGetPa
35540 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26  ge(pBt, iPage, &
35550 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a 20 20  pPage, 0)) ){.  
35560 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
35570 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  out;.  }.  rc = 
35580 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35590 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
355a0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
355b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
355c0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
355d0 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28  .  }.  put4byte(
355e0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
355f0 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74  runk);.  put4byt
35600 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
35610 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79  4], 0);.  put4by
35620 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
35630 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20  a[32], iPage);. 
35640 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
35650 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b  GE: %d new trunk
35660 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20   page replacing 
35670 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67  %d\n", pPage->pg
35680 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66  no, iTrunk));..f
35690 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  reepage_out:.  i
356a0 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20  f( pPage ){.    
356b0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
356c0 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  0;.  }.  release
356d0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72  Page(pPage);.  r
356e0 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e  eleasePage(pTrun
356f0 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  k);.  return rc;
35700 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  .}.static void f
35710 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20  reePage(MemPage 
35720 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70 52 43  *pPage, int *pRC
35730 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43 29 3d  ){.  if( (*pRC)=
35740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35750 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50 61 67    *pRC = freePag
35760 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  e2(pPage->pBt, p
35770 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Page, pPage->pgn
35780 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
35790 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c   Free any overfl
357a0 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61  ow pages associa
357b0 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
357c0 65 6e 20 43 65 6c 6c 2e 20 20 53 74 6f 72 65 0a  en Cell.  Store.
357d0 2a 2a 20 73 69 7a 65 20 69 6e 66 6f 72 6d 61 74  ** size informat
357e0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65  ion about the ce
357f0 6c 6c 20 69 6e 20 70 49 6e 66 6f 2e 0a 2a 2f 0a  ll in pInfo..*/.
35800 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
35810 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
35820 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
35830 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
35840 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43  t contains the C
35850 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ell */.  unsigne
35860 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20  d char *pCell,  
35870 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
35880 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20  of the Cell */. 
35890 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
358a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
358b0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
358c0 6f 75 74 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  out the cell */.
358d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
358e0 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  Bt;.  Pgno ovflP
358f0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
35900 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
35910 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
35920 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
35930 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
35940 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
35950 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
35960 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
35970 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
35980 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  if( pInfo->nLoca
35990 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  l==pInfo->nPaylo
359a0 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ad ){.    return
359b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
359c0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
359d0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
359e0 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
359f0 20 2a 2f 0a 20 20 7d 0a 20 20 74 65 73 74 63 61   */.  }.  testca
35a00 73 65 28 20 70 43 65 6c 6c 20 2b 20 70 49 6e 66  se( pCell + pInf
35a10 6f 2d 3e 6e 53 69 7a 65 20 3d 3d 20 70 50 61 67  o->nSize == pPag
35a20 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20  e->aDataEnd );. 
35a30 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
35a40 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65   + (pInfo->nSize
35a50 2d 31 29 20 3d 3d 20 70 50 61 67 65 2d 3e 61 44  -1) == pPage->aD
35a60 61 74 61 45 6e 64 20 29 3b 0a 20 20 69 66 28 20  ataEnd );.  if( 
35a70 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f 2d 3e 6e  pCell + pInfo->n
35a80 53 69 7a 65 20 3e 20 70 50 61 67 65 2d 3e 61 44  Size > pPage->aD
35a90 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20 2f 2a  ataEnd ){.    /*
35aa0 20 43 65 6c 6c 20 65 78 74 65 6e 64 73 20 70 61   Cell extends pa
35ab0 73 74 20 65 6e 64 20 6f 66 20 70 61 67 65 20 2a  st end of page *
35ac0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
35ad0 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
35ae0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 6f  (pPage);.  }.  o
35af0 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
35b00 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e 66 6f  te(pCell + pInfo
35b10 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  ->nSize - 4);.  
35b20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
35b30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
35b40 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20  >usableSize > 4 
35b50 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
35b60 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
35b70 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
35b80 20 3d 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   = (pInfo->nPayl
35b90 6f 61 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  oad - pInfo->nLo
35ba0 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  cal + ovflPageSi
35bb0 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65  ze - 1)/ovflPage
35bc0 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Size;.  assert( 
35bd0 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20  nOvfl>0 || .    
35be0 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28  (CORRUPT_DB && (
35bf0 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
35c00 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
35c10 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
35c20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
35c30 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
35c40 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
35c50 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
35c60 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
35c70 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
35c80 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
35c90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
35ca0 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
35cb0 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
35cc0 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
35cd0 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
35ce0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
35cf0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
35d00 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
35d10 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
35d20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
35d30 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
35d40 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
35d50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
35d60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
35d70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
35d80 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
35d90 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
35da0 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
35db0 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
35dc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
35dd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
35de0 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
35df0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
35e00 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
35e10 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
35e20 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
35e30 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
35e40 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
35e50 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
35e60 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
35e70 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
35e80 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
35e90 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
35ea0 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
35eb0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
35ec0 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
35ed0 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
35ee0 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
35ef0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
35f00 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
35f10 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
35f20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
35f30 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
35f40 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
35f50 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
35f60 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
35f70 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
35f80 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
35f90 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
35fa0 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
35fb0 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
35fc0 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
35fd0 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
35fe0 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
35ff0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
36000 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
36010 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
36020 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
36030 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
36040 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
36050 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
36060 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
36070 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
36080 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
36090 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
360a0 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
360b0 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
360c0 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
360d0 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
360e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
360f0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
36100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
36110 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
36120 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
36130 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
36140 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
36150 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36160 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
36170 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
36180 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
36190 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
361a0 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
361b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
361c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
361d0 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
361e0 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
361f0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
36200 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
36210 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
36220 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
36230 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
36240 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
36250 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
36260 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
36270 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
36280 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
36290 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
362a0 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
362b0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
362c0 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
362d0 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
362e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
362f0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
36300 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
36310 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
36320 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
36330 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
36340 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
36350 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
36360 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
36370 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
36380 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
36390 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
363a0 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
363b0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
363c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
363d0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
363e0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
363f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36400 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
36410 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
36420 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
36430 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
36440 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
36450 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
36460 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74  ll */.  const Bt
36470 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20  reePayload *pX, 
36480 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61         /* Payloa
36490 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20  d with which to 
364a0 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65  construct the ce
364b0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ll */.  int *pnS
364c0 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
364d0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
364e0 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
364f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
36500 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
36510 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
36520 63 2c 20 6e 2c 20 72 63 2c 20 6d 6e 3b 0a 20 20  c, n, rc, mn;.  
36530 69 6e 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20  int spaceLeft;. 
36540 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
36550 65 61 73 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ease;.  unsigned
36560 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
36570 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
36580 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
36590 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
365a0 6f 20 70 67 6e 6f 4f 76 66 6c 3b 0a 20 20 69 6e  o pgnoOvfl;.  in
365b0 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61 73  t nHeader;..  as
365c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
365d0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
365e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
365f0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e 6f    /* pPage is no
36600 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 72  t necessarily wr
36610 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70 43  iteable since pC
36620 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75 78  ell might be aux
36630 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66 66  iliary.  ** buff
36640 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69 73  er space that is
36650 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74   separate from t
36660 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72 20  he pPage buffer 
36670 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72 74  area */.  assert
36680 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e 61  ( pCell<pPage->a
36690 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d 26  Data || pCell>=&
366a0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
366b0 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a  ge->pBt->pageSiz
366c0 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
366d0 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
366e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
366f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
36700 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
36710 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
36720 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
36730 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28  ldPtrSize;.  if(
36740 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
36750 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
36760 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d   pX->nData + pX-
36770 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63  >nZero;.    pSrc
36780 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20   = pX->pData;.  
36790 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61    nSrc = pX->nDa
367a0 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
367b0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
367c0 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65  f ); /* fillInCe
367d0 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ll() only called
367e0 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20   for leaves */. 
367f0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
36800 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
36810 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
36820 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65  oad);.    nHeade
36830 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
36840 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
36850 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79  *(u64*)&pX->nKey
36860 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
36870 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79  assert( pX->nKey
36880 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20  <=0x7fffffff && 
36890 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20  pX->pKey!=0 );. 
368a0 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f     nSrc = nPaylo
368b0 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b  ad = (int)pX->nK
368c0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
368d0 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65  X->pKey;.    nHe
368e0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
368f0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
36900 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
36910 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c    }.  .  /* Fill
36920 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
36930 2a 2f 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d 20  */.  pPayload = 
36940 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b  &pCell[nHeader];
36950 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
36960 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
36970 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36980 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  is the common ca
36990 73 65 20 77 68 65 72 65 20 65 76 65 72 79 74 68  se where everyth
369a0 69 6e 67 20 66 69 74 73 20 6f 6e 20 74 68 65 20  ing fits on the 
369b0 62 74 72 65 65 20 70 61 67 65 0a 20 20 20 20 2a  btree page.    *
369c0 2a 20 61 6e 64 20 6e 6f 20 6f 76 65 72 66 6c 6f  * and no overflo
369d0 77 20 70 61 67 65 73 20 61 72 65 20 72 65 71 75  w pages are requ
369e0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 6e 20 3d  ired. */.    n =
369f0 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
36a00 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
36a10 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
36a20 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
36a30 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
36a40 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
36a50 65 20 3d 20 6e 3b 0a 20 20 20 20 61 73 73 65 72  e = n;.    asser
36a60 74 28 20 6e 53 72 63 3c 3d 6e 50 61 79 6c 6f 61  t( nSrc<=nPayloa
36a70 64 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  d );.    testcas
36a80 65 28 20 6e 53 72 63 3c 6e 50 61 79 6c 6f 61 64  e( nSrc<nPayload
36a90 20 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70   );.    memcpy(p
36aa0 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
36ab0 53 72 63 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Src);.    memset
36ac0 28 70 50 61 79 6c 6f 61 64 2b 6e 53 72 63 2c 20  (pPayload+nSrc, 
36ad0 30 2c 20 6e 50 61 79 6c 6f 61 64 2d 6e 53 72 63  0, nPayload-nSrc
36ae0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
36af0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
36b00 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
36b10 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
36b20 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 6f 66  ans that some of
36b30 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 6c   the content wil
36b40 6c 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 73  l need.  ** to s
36b50 70 69 6c 6c 20 6f 6e 74 6f 20 6f 76 65 72 66 6c  pill onto overfl
36b60 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20  ow pages..  */. 
36b70 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
36b80 4c 6f 63 61 6c 3b 0a 20 20 6e 20 3d 20 6d 6e 20  Local;.  n = mn 
36b90 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
36ba0 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
36bb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
36bc0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d  ;.  testcase( n=
36bd0 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
36be0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
36bf0 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
36c00 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 20  al+1 );.  if( n 
36c10 3e 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  > pPage->maxLoca
36c20 6c 20 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 73 70  l ) n = mn;.  sp
36c30 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 2a  aceLeft = n;.  *
36c40 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65  pnSize = n + nHe
36c50 61 64 65 72 20 2b 20 34 3b 0a 20 20 70 50 72 69  ader + 4;.  pPri
36c60 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
36c70 64 65 72 2b 6e 5d 3b 0a 20 20 70 54 6f 52 65 6c  der+n];.  pToRel
36c80 65 61 73 65 20 3d 20 30 3b 0a 20 20 70 67 6e 6f  ease = 0;.  pgno
36c90 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 70 42 74 20  Ovfl = 0;.  pBt 
36ca0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20  = pPage->pBt;.. 
36cb0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
36cc0 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
36cd0 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
36ce0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
36cf0 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
36d00 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
36d10 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
36d20 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
36d30 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
36d40 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
36d50 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
36d60 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
36d70 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
36d80 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
36d90 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
36da0 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
36db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
36dc0 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
36dd0 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
36de0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
36df0 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
36e00 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
36e10 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
36e20 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
36e30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
36e40 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
36e50 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
36e60 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
36e70 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
36e80 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
36e90 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
36ea0 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
36eb0 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
36ec0 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
36ed0 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
36ee0 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
36ef0 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
36f00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
36f10 0a 20 20 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  .  {.    CellInf
36f20 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67  o info;.    pPag
36f30 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
36f40 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
36f50 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
36f60 6e 48 65 61 64 65 72 3d 3d 28 69 6e 74 29 28 69  nHeader==(int)(i
36f70 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 20 2d 20 70  nfo.pPayload - p
36f80 43 65 6c 6c 29 20 29 3b 0a 20 20 20 20 61 73 73  Cell) );.    ass
36f90 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
36fa0 70 58 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  pX->nKey );.    
36fb0 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65 20  assert( *pnSize 
36fc0 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29 3b  == info.nSize );
36fd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70 61  .    assert( spa
36fe0 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e 6e  ceLeft == info.n
36ff0 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65 6e  Local );.  }.#en
37000 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  dif..  /* Write 
37010 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74 6f  the payload into
37020 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c 20   the local Cell 
37030 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69 6e  and any extra in
37040 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
37050 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  s */.  while( 1 
37060 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 50 61 79 6c  ){.    n = nPayl
37070 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e 3e 73  oad;.    if( n>s
37080 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d 20 73  paceLeft ) n = s
37090 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20 20 2f  paceLeft;..    /
370a0 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20  * If pToRelease 
370b0 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e  is not zero than
370c0 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e 74 73   pPayload points
370d0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
370e0 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20 70 54  rea.    ** of pT
370f0 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20  oRelease.  Make 
37100 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20  sure pToRelease 
37110 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
37120 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
37130 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
37140 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37150 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
37160 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
37170 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70   );..    /* If p
37180 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72 74 20  Payload is part 
37190 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
371a0 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
371b0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
371c0 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
371d0 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
371e0 20 61 73 73 65 72 74 28 20 70 50 61 79 6c 6f 61   assert( pPayloa
371f0 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  d<pPage->aData |
37200 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70 50 61  | pPayload>=&pPa
37210 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37220 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
37230 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
37240 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37250 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37260 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53 72 63  );..    if( nSrc
37270 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  >=n ){.      mem
37280 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
37290 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
372a0 65 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a  e if( nSrc>0 ){.
372b0 20 20 20 20 20 20 6e 20 3d 20 6e 53 72 63 3b 0a        n = nSrc;.
372c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61        memcpy(pPa
372d0 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b  yload, pSrc, n);
372e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
372f0 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61    memset(pPayloa
37300 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a  d, 0, n);.    }.
37310 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20      nPayload -= 
37320 6e 3b 0a 20 20 20 20 69 66 28 20 6e 50 61 79 6c  n;.    if( nPayl
37330 6f 61 64 3c 3d 30 20 29 20 62 72 65 61 6b 3b 0a  oad<=0 ) break;.
37340 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
37350 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
37360 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
37370 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
37380 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 73 70 61  = n;.    if( spa
37390 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20  ceLeft==0 ){.   
373a0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
373b0 6c 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  l = 0;.#ifndef S
373c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
373d0 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
373e0 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
373f0 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
37400 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
37410 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
37420 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
37430 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
37440 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
37450 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
37460 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
37470 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
37480 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
37490 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
374a0 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
374b0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
374c0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
374d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
374e0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
374f0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
37500 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
37510 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
37520 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37530 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
37540 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
37550 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
37560 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
37570 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
37580 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
37590 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
375a0 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
375b0 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
375c0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
375d0 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
375e0 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
375f0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
37600 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
37610 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
37620 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
37630 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
37640 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
37650 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
37660 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
37670 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
37680 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
37690 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
376a0 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
376b0 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
376c0 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
376d0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
376e0 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
376f0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
37700 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
37710 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
37720 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
37730 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
37740 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
37750 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
37760 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
37770 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
37780 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
37790 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
377a0 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
377b0 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
377c0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
377d0 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
377e0 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
377f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
37800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
37810 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
37820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
37830 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
37840 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37850 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
37860 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
37870 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
37880 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
37890 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
378a0 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
378b0 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
378c0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
378d0 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
378e0 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
378f0 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
37900 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
37910 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
37920 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
37930 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
37940 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
37950 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
37960 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
37970 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
37980 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
37990 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
379a0 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
379b0 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
379c0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
379d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
379e0 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
379f0 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
37a00 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
37a10 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
37a20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
37a30 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
37a40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
37a50 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
37a60 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
37a70 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
37a80 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
37a90 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
37aa0 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
37ab0 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
37ac0 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
37ad0 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
37ae0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
37af0 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
37b00 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
37b10 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
37b20 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
37b30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
37b40 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
37b50 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
37b60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
37b70 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
37b80 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
37b90 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
37ba0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
37bb0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
37bc0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
37bd0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
37be0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
37bf0 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
37c00 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
37c10 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
37c20 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
37c30 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
37c40 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
37c50 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
37c60 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
37c70 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
37c80 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
37c90 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
37ca0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
37cb0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
37cc0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
37cd0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
37ce0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
37cf0 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
37d00 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
37d10 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
37d20 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
37d30 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
37d40 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
37d50 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
37d60 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
37d70 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
37d80 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
37d90 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
37da0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
37db0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
37dc0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
37dd0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
37de0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
37df0 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
37e00 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
37e10 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 20  *pRC ) return;. 
37e20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
37e30 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
37e40 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
37e50 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
37e60 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
37e70 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
37e80 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
37e90 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
37ea0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
37eb0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37ec0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
37ed0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
37ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
37ef0 67 65 2d 3e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a  ge->nFree>=0 );.
37f00 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
37f10 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20 26  aData;.  ptr = &
37f20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 5b  pPage->aCellIdx[
37f30 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67  2*idx];.  pc = g
37f40 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20  et2byte(ptr);.  
37f50 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
37f60 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63 61  Offset;.  testca
37f70 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74 65  se( pc==get2byte
37f80 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
37f90 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37fa0 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d  +sz==pPage->pBt-
37fb0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20  >usableSize );. 
37fc0 20 69 66 28 20 70 63 2b 73 7a 20 3e 20 70 50 61   if( pc+sz > pPa
37fd0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
37fe0 69 7a 65 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ize ){.    *pRC 
37ff0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
38000 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
38010 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66 72  n;.  }.  rc = fr
38020 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 70  eeSpace(pPage, p
38030 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72 63  c, sz);.  if( rc
38040 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 72   ){.    *pRC = r
38050 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  c;.    return;. 
38060 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c   }.  pPage->nCel
38070 6c 2d 2d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  l--;.  if( pPage
38080 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ->nCell==0 ){.  
38090 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68    memset(&data[h
380a0 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20  dr+1], 0, 4);.  
380b0 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
380c0 30 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  0;.    put2byte(
380d0 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 50  &data[hdr+5], pP
380e0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
380f0 53 69 7a 65 29 3b 0a 20 20 20 20 70 50 61 67 65  Size);.    pPage
38100 2d 3e 6e 46 72 65 65 20 3d 20 70 50 61 67 65 2d  ->nFree = pPage-
38110 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
38120 20 2d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   - pPage->hdrOff
38130 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  set.            
38140 20 20 20 20 20 20 20 20 20 20 20 2d 20 70 50 61             - pPa
38150 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
38160 20 2d 20 38 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   - 8;.  }else{. 
38170 20 20 20 6d 65 6d 6d 6f 76 65 28 70 74 72 2c 20     memmove(ptr, 
38180 70 74 72 2b 32 2c 20 32 2a 28 70 50 61 67 65 2d  ptr+2, 2*(pPage-
38190 3e 6e 43 65 6c 6c 20 2d 20 69 64 78 29 29 3b 0a  >nCell - idx));.
381a0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
381b0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
381c0 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50  ->nCell);.    pP
381d0 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 32 3b  age->nFree += 2;
381e0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
381f0 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 20  sert a new cell 
38200 6f 6e 20 70 50 61 67 65 20 61 74 20 63 65 6c 6c  on pPage at cell
38210 20 69 6e 64 65 78 20 22 69 22 2e 20 20 70 43 65   index "i".  pCe
38220 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ll points to the
38230 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  .** content of t
38240 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  he cell..**.** I
38250 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
38260 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  nt will fit on t
38270 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 70 75  he page, then pu
38280 74 20 69 74 20 74 68 65 72 65 2e 20 20 49 66 20  t it there.  If 
38290 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66  it.** will not f
382a0 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 20  it, then make a 
382b0 63 6f 70 79 20 6f 66 20 74 68 65 20 63 65 6c 6c  copy of the cell
382c0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54   content into pT
382d0 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20  emp if.** pTemp 
382e0 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65  is not null.  Re
382f0 67 61 72 64 6c 65 73 73 20 6f 66 20 70 54 65 6d  gardless of pTem
38300 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65  p, allocate a ne
38310 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50  w entry.** in pP
38320 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e  age->apOvfl[] an
38330 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e 74 20  d make it point 
38340 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
38350 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a 20 69  ent (either.** i
38360 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65 20 6f  n pTemp or the o
38370 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29 20 61  riginal pCell) a
38380 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64 20 69  nd also record i
38390 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c  ts index. .** Al
383a0 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 65  locating a new e
383b0 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d 3e 61  ntry in pPage->a
383c0 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73 20 74  Cell[] implies t
383d0 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e  hat .** pPage->n
383e0 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e 63 72  Overflow is incr
383f0 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a  emented..**.** *
38400 70 52 43 20 6d 75 73 74 20 62 65 20 53 51 4c 49  pRC must be SQLI
38410 54 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20  TE_OK when this 
38420 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
38430 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
38440 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  d insertCell(.  
38450 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
38460 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
38470 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
38480 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
38490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
384a0 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
384b0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66