/ Hex Artifact Content
Login

Artifact 11c18d6d4b23570602d6d99db681d5c431917cab9f4321d87c7c31cd583f2964:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  endif../*.** Imp
0e90: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
0ea0: 68 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  he SQLITE_CORRUP
0eb0: 54 5f 50 41 47 45 28 29 20 6d 61 63 72 6f 2e 20  T_PAGE() macro. 
0ec0: 54 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 2a  Takes a single.*
0ed0: 2a 20 28 4d 65 6d 50 61 67 65 2a 29 20 61 73 20  * (MemPage*) as 
0ee0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  an argument. The
0ef0: 20 28 4d 65 6d 50 61 67 65 2a 29 20 6d 75 73 74   (MemPage*) must
0f00: 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2a   not be NULL..**
0f10: 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 44 45  .** If SQLITE_DE
0f20: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
0f30: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  ed, then this ma
0f40: 63 72 6f 20 69 73 20 65 71 75 69 76 61 6c 65 6e  cro is equivalen
0f50: 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  t to.** SQLITE_C
0f60: 4f 52 52 55 50 54 5f 42 4b 50 54 2e 20 4f 72 2c  ORRUPT_BKPT. Or,
0f70: 20 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   if SQLITE_DEBUG
0f80: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0f90: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a 2a 2a  e log message.**
0fa0: 20 6e 6f 72 6d 61 6c 6c 79 20 70 72 6f 64 75 63   normally produc
0fb0: 65 64 20 61 73 20 61 20 73 69 64 65 2d 65 66 66  ed as a side-eff
0fc0: 65 63 74 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f  ect of SQLITE_CO
0fd0: 52 52 55 50 54 5f 42 4b 50 54 20 69 73 20 61 75  RRUPT_BKPT is au
0fe0: 67 6d 65 6e 74 65 64 0a 2a 2a 20 77 69 74 68 20  gmented.** with 
0ff0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1000: 61 6e 64 20 66 69 6c 65 6e 61 6d 65 20 61 73 73  and filename ass
1010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1020: 20 28 4d 65 6d 50 61 67 65 2a 29 2e 0a 2a 2f 0a   (MemPage*)..*/.
1030: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1040: 42 55 47 0a 69 6e 74 20 63 6f 72 72 75 70 74 50  BUG.int corruptP
1050: 61 67 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e  ageError(int lin
1060: 65 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 29  eno, MemPage *p)
1070: 7b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a  {.  char *zMsg;.
1080: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
1090: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10a0: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zMsg = sqlite3_m
10b0: 70 72 69 6e 74 66 28 22 64 61 74 61 62 61 73 65  printf("database
10c0: 20 63 6f 72 72 75 70 74 69 6f 6e 20 70 61 67 65   corruption page
10d0: 20 25 64 20 6f 66 20 25 73 22 2c 0a 20 20 20 20   %d of %s",.    
10e0: 20 20 28 69 6e 74 29 70 2d 3e 70 67 6e 6f 2c 20    (int)p->pgno, 
10f0: 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
1100: 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
1110: 67 65 72 2c 20 30 29 0a 20 20 29 3b 0a 20 20 73  ger, 0).  );.  s
1120: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1130: 61 6c 6c 6f 63 28 29 3b 0a 20 20 69 66 28 20 7a  alloc();.  if( z
1140: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
1150: 65 33 52 65 70 6f 72 74 45 72 72 6f 72 28 53 51  e3ReportError(SQ
1160: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6c 69  LITE_CORRUPT, li
1170: 6e 65 6e 6f 2c 20 7a 4d 73 67 29 3b 0a 20 20 7d  neno, zMsg);.  }
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1190: 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  zMsg);.  return 
11a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11b0: 4b 50 54 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20  KPT;.}.# define 
11c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
11d0: 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20 63 6f  AGE(pMemPage) co
11e0: 72 72 75 70 74 50 61 67 65 45 72 72 6f 72 28 5f  rruptPageError(_
11f0: 5f 4c 49 4e 45 5f 5f 2c 20 70 4d 65 6d 50 61 67  _LINE__, pMemPag
1200: 65 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  e).#else.# defin
1210: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
1220: 5f 50 41 47 45 28 70 4d 65 6d 50 61 67 65 29 20  _PAGE(pMemPage) 
1230: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
1240: 47 4e 4f 28 70 4d 65 6d 50 61 67 65 2d 3e 70 67  GNO(pMemPage->pg
1250: 6e 6f 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  no).#endif..#ifn
1260: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1270: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 0a 23 69  SHARED_CACHE..#i
1280: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1290: 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66  G./*.**** This f
12a0: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
12b0: 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
12c0: 61 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  an assert() stat
12d0: 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a  ement. ***.**.**
12e0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
12f0: 20 70 42 74 72 65 65 20 68 6f 6c 64 73 20 74 68   pBtree holds th
1300: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
1310: 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
1320: 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20 74 61 62  e to the .** tab
1330: 6c 65 20 77 69 74 68 20 72 6f 6f 74 20 70 61 67  le with root pag
1340: 65 20 69 52 6f 6f 74 2e 20 20 20 52 65 74 75 72  e iRoot.   Retur
1350: 6e 20 31 20 69 66 20 69 74 20 64 6f 65 73 20 61  n 1 if it does a
1360: 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a  nd 0 if not..**.
1370: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1380: 77 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20  when writing to 
1390: 61 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  a table with roo
13a0: 74 2d 70 61 67 65 20 69 52 6f 6f 74 20 76 69 61  t-page iRoot via
13b0: 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f 6e 6e 65   .** Btree conne
13c0: 63 74 69 6f 6e 20 70 42 74 72 65 65 3a 0a 2a 2a  ction pBtree:.**
13d0: 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28 20 68  .**    assert( h
13e0: 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
13f0: 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65 2c 20 69  leLock(pBtree, i
1400: 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54 45 5f 4c  Root, 0, WRITE_L
1410: 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a 20 57 68  OCK) );.**.** Wh
1420: 65 6e 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  en writing to an
1430: 20 69 6e 64 65 78 20 74 68 61 74 20 72 65 73 69   index that resi
1440: 64 65 73 20 69 6e 20 61 20 73 68 61 72 61 62 6c  des in a sharabl
1450: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1460: 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  .** caller shoul
1470: 64 20 68 61 76 65 20 66 69 72 73 74 20 6f 62 74  d have first obt
1480: 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20 73 70 65  ained a lock spe
1490: 63 69 66 79 69 6e 67 20 74 68 65 20 72 6f 6f 74  cifying the root
14a0: 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
14b0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61  corresponding ta
14c0: 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b 65 73 20  ble. This makes 
14d0: 74 68 69 6e 67 73 20 61 20 62 69 74 20 6d 6f 72  things a bit mor
14e0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2c 0a 2a  e complicated,.*
14f0: 2a 20 61 73 20 74 68 69 73 20 6d 6f 64 75 6c 65  * as this module
1500: 20 74 72 65 61 74 73 20 65 61 63 68 20 74 61 62   treats each tab
1510: 6c 65 20 61 73 20 61 20 73 65 70 61 72 61 74 65  le as a separate
1520: 20 73 74 72 75 63 74 75 72 65 2e 20 54 6f 20 64   structure. To d
1530: 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74 68 65 20  etermine.** the 
1540: 74 61 62 6c 65 20 63 6f 72 72 65 73 70 6f 6e 64  table correspond
1550: 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ing to the index
1560: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
1570: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1580: 20 68 61 73 20 74 6f 20 73 65 61 72 63 68 20 74   has to search t
1590: 68 72 6f 75 67 68 20 74 68 65 20 64 61 74 61 62  hrough the datab
15a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2a 0a 2a  ase schema..**.*
15b0: 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 61 20 6c  * Instead of a l
15c0: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
15d0: 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64 20 61 74  /index rooted at
15e0: 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 74 68 65   page iRoot, the
15f0: 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a 2a 20 68   caller may.** h
1600: 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  old a write-lock
1610: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
1620: 61 62 6c 65 20 28 72 6f 6f 74 20 70 61 67 65 20  able (root page 
1630: 31 29 2e 20 54 68 69 73 20 69 73 20 61 6c 73 6f  1). This is also
1640: 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c 65 2e 0a  .** acceptable..
1650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
1660: 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
1670: 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  eLock(.  Btree *
1680: 70 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20  pBtree,         
1690: 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61 74 20 6d  /* Handle that m
16a0: 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b 20 2a 2f  ust hold lock */
16b0: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
16d0: 74 20 70 61 67 65 20 6f 66 20 62 2d 74 72 65 65  t page of b-tree
16e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49 6e 64 65   */.  int isInde
16f0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x,           /* 
1700: 54 72 75 65 20 69 66 20 69 52 6f 6f 74 20 69 73  True if iRoot is
1710: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 6e 20   the root of an 
1720: 69 6e 64 65 78 20 62 2d 74 72 65 65 20 2a 2f 0a  index b-tree */.
1730: 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79 70 65 20    int eLockType 
1740: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1750: 69 72 65 64 20 6c 6f 63 6b 20 74 79 70 65 20 28  ired lock type (
1760: 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49  READ_LOCK or WRI
1770: 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29 7b 0a 20  TE_LOCK) */.){. 
1780: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
1790: 20 3d 20 28 53 63 68 65 6d 61 20 2a 29 70 42 74   = (Schema *)pBt
17a0: 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63 68 65 6d  ree->pBt->pSchem
17b0: 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61 62 20 3d  a;.  Pgno iTab =
17c0: 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c   0;.  BtLock *pL
17d0: 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ock;..  /* If th
17e0: 69 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  is database is n
17f0: 6f 74 20 73 68 61 72 65 61 62 6c 65 2c 20 6f 72  ot shareable, or
1800: 20 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   if the client i
1810: 73 20 72 65 61 64 69 6e 67 0a 20 20 2a 2a 20 61  s reading.  ** a
1820: 6e 64 20 68 61 73 20 74 68 65 20 72 65 61 64 2d  nd has the read-
1830: 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  uncommitted flag
1840: 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f 20 6c 6f   set, then no lo
1850: 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ck is required. 
1860: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  .  ** Return tru
1870: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  e immediately.. 
1880: 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 72 65   */.  if( (pBtre
1890: 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d 30 29 0a  e->sharable==0).
18a0: 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54 79 70 65     || (eLockType
18b0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26 26 20 28  ==READ_LOCK && (
18c0: 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c 61 67  pBtree->db->flag
18d0: 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
18e0: 6e 63 6f 6d 6d 69 74 29 29 0a 20 20 29 7b 0a 20  ncommit)).  ){. 
18f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
1900: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c  ..  /* If the cl
1910: 69 65 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20  ient is reading 
1920: 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69   or writing an i
1930: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 73 63 68  ndex and the sch
1940: 65 6d 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20  ema is.  ** not 
1950: 6c 6f 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20  loaded, then it 
1960: 69 73 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74  is too difficult
1970: 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65   to actually che
1980: 63 6b 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a  ck to see if.  *
1990: 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
19a0: 63 6b 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53  cks are held.  S
19b0: 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  o do not bother 
19c0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72  - just return tr
19d0: 75 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61  ue..  ** This ca
19e0: 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65  se does not come
19f0: 20 75 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61   up very often a
1a00: 6e 79 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  nyhow..  */.  if
1a10: 28 20 69 73 49 6e 64 65 78 20 26 26 20 28 21 70  ( isIndex && (!p
1a20: 53 63 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65  Schema || (pSche
1a30: 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26  ma->schemaFlags&
1a40: 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
1a50: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ==0) ){.    retu
1a60: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 1;.  }..  /* 
1a70: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 72  Figure out the r
1a80: 6f 6f 74 2d 70 61 67 65 20 74 68 61 74 20 74 68  oot-page that th
1a90: 65 20 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65  e lock should be
1aa0: 20 68 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61   held on. For ta
1ab0: 62 6c 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73  ble.  ** b-trees
1ac0: 2c 20 74 68 69 73 20 69 73 20 6a 75 73 74 20 74  , this is just t
1ad0: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
1ae0: 74 68 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67  the b-tree being
1af0: 20 72 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72   read or.  ** wr
1b00: 69 74 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78  itten. For index
1b10: 20 62 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20   b-trees, it is 
1b20: 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
1b30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
1b40: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a    ** table.  */.
1b50: 20 20 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b    if( isIndex ){
1b60: 0a 20 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70  .    HashElem *p
1b70: 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69  ;.    for(p=sqli
1b80: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
1b90: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20  hema->idxHash); 
1ba0: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
1bb0: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49  ext(p)){.      I
1bc0: 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e  ndex *pIdx = (In
1bd0: 64 65 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68  dex *)sqliteHash
1be0: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69  Data(p);.      i
1bf0: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28  f( pIdx->tnum==(
1c00: 69 6e 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20  int)iRoot ){.   
1c10: 20 20 20 20 20 69 66 28 20 69 54 61 62 20 29 7b       if( iTab ){
1c20: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77  .          /* Tw
1c30: 6f 20 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65  o or more indexe
1c40: 73 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65  s share the same
1c50: 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65   root page.  The
1c60: 72 65 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20  re must.        
1c70: 20 20 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72    ** be imposter
1c80: 20 74 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73   tables.  So jus
1c90: 74 20 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20  t return true.  
1ca0: 54 68 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f  The assert is no
1cb0: 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  t.          ** u
1cc0: 73 65 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61  seful in that ca
1cd0: 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  se. */.         
1ce0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1cf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61     }.        iTa
1d00: 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65  b = pIdx->pTable
1d10: 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a  ->tnum;.      }.
1d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1d30: 20 20 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b     iTab = iRoot;
1d40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
1d50: 68 20 66 6f 72 20 74 68 65 20 72 65 71 75 69 72  h for the requir
1d60: 65 64 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20  ed lock. Either 
1d70: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
1d80: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20  root-page iTab, 
1d90: 61 20 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f  a .  ** write-lo
1da0: 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61  ck on the schema
1db0: 20 74 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74   table, or (if t
1dc0: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1dd0: 64 69 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61  ding) a.  ** rea
1de0: 64 2d 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77  d-lock on iTab w
1df0: 69 6c 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74  ill suffice. Ret
1e00: 75 72 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20  urn 1 if any of 
1e10: 74 68 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e  these are found.
1e20: 20 20 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b    */.  for(pLock
1e30: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c  =pBtree->pBt->pL
1e40: 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63  ock; pLock; pLoc
1e50: 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b  k=pLock->pNext){
1e60: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1e70: 70 42 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a  pBtree==pBtree .
1e80: 20 20 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e       && (pLock->
1e90: 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20  iTable==iTab || 
1ea0: 28 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57  (pLock->eLock==W
1eb0: 52 49 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f  RITE_LOCK && pLo
1ec0: 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a  ck->iTable==1)).
1ed0: 20 20 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65       && pLock->e
1ee0: 4c 6f 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20  Lock>=eLockType 
1ef0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
1f00: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1f10: 7d 0a 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74  }..  /* Failed t
1f20: 6f 20 66 69 6e 64 20 74 68 65 20 72 65 71 75 69  o find the requi
1f30: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72  red lock. */.  r
1f40: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1f50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
1f60: 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  G */..#ifdef SQL
1f70: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a  ITE_DEBUG./*.***
1f80: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1f90: 6d 61 79 20 62 65 20 75 73 65 64 20 61 73 20 70  may be used as p
1fa0: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
1fb0: 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e  statements only.
1fc0: 20 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75   ****.**.** Retu
1fd0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 77 6f  rn true if it wo
1fe0: 75 6c 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66  uld be illegal f
1ff0: 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77 72 69  or pBtree to wri
2000: 74 65 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74  te into the.** t
2010: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f  able or index ro
2020: 6f 74 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65  oted at iRoot be
2030: 63 61 75 73 65 20 6f 74 68 65 72 20 73 68 61 72  cause other shar
2040: 65 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  ed connections a
2050: 72 65 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f  re.** simultaneo
2060: 75 73 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61  usly reading tha
2070: 74 20 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20  t same table or 
2080: 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  index..**.** It 
2090: 69 73 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70  is illegal for p
20a0: 42 74 72 65 65 20 74 6f 20 77 72 69 74 65 20 69  Btree to write i
20b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72  f some other Btr
20c0: 65 65 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  ee object that.*
20d0: 2a 20 73 68 61 72 65 73 20 74 68 65 20 73 61 6d  * shares the sam
20e0: 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  e BtShared objec
20f0: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72  t is currently r
2100: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
2110: 67 0a 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74  g.** the iRoot t
2120: 61 62 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69  able.  Except, i
2130: 66 20 74 68 65 20 6f 74 68 65 72 20 42 74 72 65  f the other Btre
2140: 65 20 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65  e object has the
2150: 0a 2a 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69  .** read-uncommi
2160: 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74  tted flag set, t
2170: 68 65 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  hen it is OK for
2180: 20 74 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63   the other objec
2190: 74 20 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72  t to.** have a r
21a0: 65 61 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  ead cursor..**.*
21b0: 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  * For example, b
21c0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
21d0: 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65   any part of the
21e0: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a   table or index.
21f0: 2a 2a 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  ** rooted at pag
2200: 65 20 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f  e iRoot, one sho
2210: 75 6c 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20  uld call:.**.** 
2220: 20 20 20 61 73 73 65 72 74 28 20 21 68 61 73 52     assert( !hasR
2230: 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74  eadConflicts(pBt
2240: 72 65 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a  ree, iRoot) );.*
2250: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
2260: 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74  ReadConflicts(Bt
2270: 72 65 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e  ree *pBtree, Pgn
2280: 6f 20 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75  o iRoot){.  BtCu
2290: 72 73 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70  rsor *p;.  for(p
22a0: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
22b0: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
22c0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22d0: 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f  ->pgnoRoot==iRoo
22e0: 74 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42  t .     && p->pB
22f0: 74 72 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20  tree!=pBtree.   
2300: 20 20 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72    && 0==(p->pBtr
2310: 65 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  ee->db->flags & 
2320: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2330: 6d 69 74 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  mit).    ){.    
2340: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2350: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2360: 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ;.}.#endif    /*
2370: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44   #ifdef SQLITE_D
2380: 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 51  EBUG */../*.** Q
2390: 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20 42  uery to see if B
23a0: 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d 61  tree handle p ma
23b0: 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  y obtain a lock 
23c0: 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a 2a  of type eLock .*
23d0: 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  * (READ_LOCK or 
23e0: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20 74  WRITE_LOCK) on t
23f0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
2400: 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52 65  ot-page iTab. Re
2410: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  turn.** SQLITE_O
2420: 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d 61  K if the lock ma
2430: 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28 62  y be obtained (b
2440: 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65 74  y calling.** set
2450: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2460: 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c 49  Lock()), or SQLI
2470: 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f 74  TE_LOCKED if not
2480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2490: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
24a0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
24b0: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75  *p, Pgno iTab, u
24c0: 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68  8 eLock){.  BtSh
24d0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
24e0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49  Bt;.  BtLock *pI
24f0: 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ter;..  assert( 
2500: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2510: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
2520: 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45  ssert( eLock==RE
2530: 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b  AD_LOCK || eLock
2540: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2550: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21    assert( p->db!
2560: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2570: 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53  !(p->db->flags&S
2580: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
2590: 69 74 29 7c 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54  it)||eLock==WRIT
25a0: 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62 3d 3d 31 20  E_LOCK||iTab==1 
25b0: 29 3b 0a 20 20 0a 20 20 2f 2a 20 49 66 20 72 65  );.  .  /* If re
25c0: 71 75 65 73 74 69 6e 67 20 61 20 77 72 69 74 65  questing a write
25d0: 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20  -lock, then the 
25e0: 42 74 72 65 65 20 6d 75 73 74 20 68 61 76 65 20  Btree must have 
25f0: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 0a 20 20  an open write.  
2600: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
2610: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 41 6e 64  n this file. And
2620: 2c 20 6f 62 76 69 6f 75 73 6c 79 2c 20 66 6f 72  , obviously, for
2630: 20 74 68 69 73 20 74 6f 20 62 65 20 73 6f 20 74   this to be so t
2640: 68 65 72 65 20 0a 20 20 2a 2a 20 6d 75 73 74 20  here .  ** must 
2650: 62 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  be an open write
2660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2670: 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  the file itself.
2680: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2690: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26a0: 20 7c 7c 20 28 70 3d 3d 70 42 74 2d 3e 70 57 72   || (p==pBt->pWr
26b0: 69 74 65 72 20 26 26 20 70 2d 3e 69 6e 54 72 61  iter && p->inTra
26c0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
26d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
26e0: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
26f0: 7c 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  | pBt->inTransac
2700: 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
2710: 45 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  E );.  .  /* Thi
2720: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
2730: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
2740: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
2750: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
2760: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
2770: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2780: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
2790: 20 49 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   If some other c
27a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c  onnection is hol
27b0: 64 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ding an exclusiv
27c0: 65 20 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a  e lock, the.  **
27d0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20   requested lock 
27e0: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  may not be obtai
27f0: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
2800: 70 42 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20  pBt->pWriter!=p 
2810: 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
2820: 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56  s & BTS_EXCLUSIV
2830: 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)!=0 ){.    sql
2840: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2850: 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 42 74  ocked(p->db, pBt
2860: 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62 29 3b 0a  ->pWriter->db);.
2870: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2880: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
2890: 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  ACHE;.  }..  for
28a0: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
28b0: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
28c0: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
28d0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74     /* The condit
28e0: 69 6f 6e 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63  ion (pIter->eLoc
28f0: 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e 20 74 68 65  k!=eLock) in the
2900: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 66 28 2e 2e   following if(..
2910: 2e 29 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  .) .    ** state
2920: 6d 65 6e 74 20 69 73 20 61 20 73 69 6d 70 6c 69  ment is a simpli
2930: 66 69 63 61 74 69 6f 6e 20 6f 66 3a 0a 20 20 20  fication of:.   
2940: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 28 65 4c   **.    **   (eL
2950: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2960: 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d  || pIter->eLock=
2970: 3d 57 52 49 54 45 5f 4c 4f 43 4b 29 0a 20 20 20  =WRITE_LOCK).   
2980: 20 2a 2a 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65   **.    ** since
2990: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 69 66   we know that if
29a0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
29b0: 43 4b 2c 20 74 68 65 6e 20 6e 6f 20 6f 74 68 65  CK, then no othe
29c0: 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20  r connection.   
29d0: 20 2a 2a 20 6d 61 79 20 68 6f 6c 64 20 61 20 57   ** may hold a W
29e0: 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79  RITE_LOCK on any
29f0: 20 74 61 62 6c 65 20 69 6e 20 74 68 69 73 20 66   table in this f
2a00: 69 6c 65 20 28 73 69 6e 63 65 20 74 68 65 72 65  ile (since there
2a10: 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
2a20: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 77 72 69   be a single wri
2a30: 74 65 72 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ter)..    */.   
2a40: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
2a50: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2a60: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2a70: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a  ==WRITE_LOCK );.
2a80: 20 20 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63      assert( eLoc
2a90: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2aa0: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70  pIter->pBtree==p
2ab0: 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b   || pIter->eLock
2ac0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  ==READ_LOCK);.  
2ad0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
2ae0: 72 65 65 21 3d 70 20 26 26 20 70 49 74 65 72 2d  ree!=p && pIter-
2af0: 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62 20 26 26  >iTable==iTab &&
2b00: 20 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65   pIter->eLock!=e
2b10: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71  Lock ){.      sq
2b20: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42  lite3ConnectionB
2b30: 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49  locked(p->db, pI
2b40: 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  ter->pBtree->db)
2b50: 3b 0a 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63  ;.      if( eLoc
2b60: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b  k==WRITE_LOCK ){
2b70: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b80: 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72   p==pBt->pWriter
2b90: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   );.        pBt-
2ba0: 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
2bb0: 5f 50 45 4e 44 49 4e 47 3b 0a 20 20 20 20 20 20  _PENDING;.      
2bc0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
2bd0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
2be0: 52 45 44 43 41 43 48 45 3b 0a 20 20 20 20 7d 0a  REDCACHE;.    }.
2bf0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2c00: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2c10: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
2c20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
2c30: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2c40: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
2c50: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
2c60: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
2c70: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
2c80: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
2c90: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
2ca0: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
2cb0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
2cc0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
2cd0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
2ce0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
2cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d00: 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
2d10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
2d20: 2a 2a 20 20 20 28 61 29 20 54 68 65 20 73 70 65  **   (a) The spe
2d30: 63 69 66 69 65 64 20 42 74 72 65 65 20 6f 62 6a  cified Btree obj
2d40: 65 63 74 20 70 20 69 73 20 63 6f 6e 6e 65 63 74  ect p is connect
2d50: 65 64 20 74 6f 20 61 20 73 68 61 72 61 62 6c 65  ed to a sharable
2d60: 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
2d70: 73 65 20 28 6f 6e 65 20 77 69 74 68 20 74 68 65  se (one with the
2d80: 20 42 74 53 68 61 72 65 64 2e 73 68 61 72 61 62   BtShared.sharab
2d90: 6c 65 20 66 6c 61 67 20 73 65 74 29 2c 20 61 6e  le flag set), an
2da0: 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62 29 20 4e 6f  d.**.**   (b) No
2db0: 20 6f 74 68 65 72 20 42 74 72 65 65 20 6f 62 6a   other Btree obj
2dc0: 65 63 74 73 20 68 6f 6c 64 20 61 20 6c 6f 63 6b  ects hold a lock
2dd0: 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73 0a   that conflicts.
2de0: 2a 2a 20 20 20 20 20 20 20 77 69 74 68 20 74 68  **       with th
2df0: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2e00: 20 28 69 2e 65 2e 20 71 75 65 72 79 53 68 61 72   (i.e. queryShar
2e10: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e20: 28 29 20 68 61 73 0a 2a 2a 20 20 20 20 20 20 20  () has.**       
2e30: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
2e40: 6c 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  led and returned
2e50: 20 53 51 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a   SQLITE_OK)..**.
2e60: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2e70: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2e80: 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20 73 75  lock is added su
2e90: 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51 4c 49  ccessfully. SQLI
2ea0: 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20  TE_NOMEM .** is 
2eb0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61  returned if a ma
2ec0: 6c 6c 6f 63 20 61 74 74 65 6d 70 74 20 66 61 69  lloc attempt fai
2ed0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ls..*/.static in
2ee0: 74 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  t setSharedCache
2ef0: 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20  TableLock(Btree 
2f00: 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c 65 2c  *p, Pgno iTable,
2f10: 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74   u8 eLock){.  Bt
2f20: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2f30: 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a  >pBt;.  BtLock *
2f40: 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 4c  pLock = 0;.  BtL
2f50: 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61  ock *pIter;..  a
2f60: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2f70: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2f80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c   );.  assert( eL
2f90: 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c  ock==READ_LOCK |
2fa0: 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c  | eLock==WRITE_L
2fb0: 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
2fc0: 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a 20 20   p->db!=0 );..  
2fd0: 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  /* A connection 
2fe0: 77 69 74 68 20 74 68 65 20 72 65 61 64 2d 75 6e  with the read-un
2ff0: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 73  committed flag s
3000: 65 74 20 77 69 6c 6c 20 6e 65 76 65 72 20 74 72  et will never tr
3010: 79 20 74 6f 0a 20 20 2a 2a 20 6f 62 74 61 69 6e  y to.  ** obtain
3020: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 75 73 69   a read-lock usi
3030: 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
3040: 2e 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 64 2d  . The only read-
3050: 6c 6f 63 6b 20 6f 62 74 61 69 6e 65 64 0a 20 20  lock obtained.  
3060: 2a 2a 20 62 79 20 61 20 63 6f 6e 6e 65 63 74 69  ** by a connecti
3070: 6f 6e 20 69 6e 20 72 65 61 64 2d 75 6e 63 6f 6d  on in read-uncom
3080: 6d 69 74 74 65 64 20 6d 6f 64 65 20 69 73 20 6f  mitted mode is o
3090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
30a0: 74 65 72 20 0a 20 20 2a 2a 20 74 61 62 6c 65 2c  ter .  ** table,
30b0: 20 61 6e 64 20 74 68 61 74 20 6c 6f 63 6b 20 69   and that lock i
30c0: 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 42 74  s obtained in Bt
30d0: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 29 2e  reeBeginTrans().
30e0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30    */.  assert( 0
30f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
3100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
3110: 6d 69 74 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57  mit) || eLock==W
3120: 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  RITE_LOCK );..  
3130: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
3140: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
3150: 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
3160: 61 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65  able b-tree afte
3170: 72 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62  r it .  ** has b
3180: 65 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74  een determined t
3190: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74  hat no other b-t
31a0: 72 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66  ree holds a conf
31b0: 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a  licting lock.  *
31c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  /.  assert( p->s
31d0: 68 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73  harable );.  ass
31e0: 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ert( SQLITE_OK==
31f0: 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
3200: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
3210: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
3220: 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63    /* First searc
3230: 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61  h the list for a
3240: 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20  n existing lock 
3250: 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a  on this table. *
3260: 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42  /.  for(pIter=pB
3270: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
3280: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
3290: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ext){.    if( pI
32a0: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
32b0: 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42  ble && pIter->pB
32c0: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
32d0: 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a   pLock = pIter;.
32e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
32f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
3300: 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68  the above search
3310: 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20   did not find a 
3320: 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73  BtLock struct as
3330: 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20  sociating Btree 
3340: 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c  p.  ** with tabl
3350: 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61  e iTable, alloca
3360: 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20  te one and link 
3370: 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74  it into the list
3380: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c  ..  */.  if( !pL
3390: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b  ock ){.    pLock
33a0: 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c   = (BtLock *)sql
33b0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
33c0: 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a  izeof(BtLock));.
33d0: 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29      if( !pLock )
33e0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
33f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
3400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 6f 63  ;.    }.    pLoc
3410: 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54 61 62  k->iTable = iTab
3420: 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70  le;.    pLock->p
3430: 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 70  Btree = p;.    p
3440: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 42  Lock->pNext = pB
3450: 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42  t->pLock;.    pB
3460: 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b  t->pLock = pLock
3470: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  ;.  }..  /* Set 
3480: 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b  the BtLock.eLock
3490: 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74 68 65   variable to the
34a0: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68 65 20   maximum of the 
34b0: 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a  current lock.  *
34c0: 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  * and the reques
34d0: 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73 20 6d  ted lock. This m
34e0: 65 61 6e 73 20 69 66 20 61 20 77 72 69 74 65 2d  eans if a write-
34f0: 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61 64 79  lock was already
3500: 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64 20 61   held.  ** and a
3510: 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71 75 65   read-lock reque
3520: 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74 20 69  sted, we don't i
3530: 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77 6e 67  ncorrectly downg
3540: 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 20  rade the lock.. 
3550: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 57 52   */.  assert( WR
3560: 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f  ITE_LOCK>READ_LO
3570: 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c 6f 63  CK );.  if( eLoc
3580: 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29  k>pLock->eLock )
3590: 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f  {.    pLock->eLo
35a0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
35b0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35c0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
35d0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
35e0: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
35f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3600: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
3610: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c  /*.** Release al
3620: 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f 63 6b  l the table lock
3630: 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65  s (locks obtaine
3640: 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f 0a 2a  d via calls to.*
3650: 2a 20 74 68 65 20 73 65 74 53 68 61 72 65 64 43  * the setSharedC
3660: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20  acheTableLock() 
3670: 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20  procedure) held 
3680: 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  by Btree object 
3690: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  p..**.** This fu
36a0: 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
36b0: 68 61 74 20 42 74 72 65 65 20 70 20 68 61 73 20  hat Btree p has 
36c0: 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  an open read or 
36d0: 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e 73 61  write .** transa
36e0: 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64 6f 65  ction. If it doe
36f0: 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
3700: 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61 67  BTS_PENDING flag
3710: 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63 6f 72  .** may be incor
3720: 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64 2e 0a  rectly cleared..
3730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
3740: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
3750: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72  heTableLocks(Btr
3760: 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
3770: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
3780: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49  ;.  BtLock **ppI
3790: 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63  ter = &pBt->pLoc
37a0: 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  k;..  assert( sq
37b0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
37c0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73  utex(p) );.  ass
37d0: 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65  ert( p->sharable
37e0: 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72 20 29   || 0==*ppIter )
37f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  ;.  assert( p->i
3800: 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20 20 77  nTrans>0 );..  w
3810: 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b  hile( *ppIter ){
3820: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3830: 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20  ck = *ppIter;.  
3840: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
3850: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 45  btsFlags & BTS_E
3860: 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c 7c 20  XCLUSIVE)==0 || 
3870: 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 4c  pBt->pWriter==pL
3880: 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b 0a 20  ock->pBtree );. 
3890: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
38a0: 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72 61 6e  ->pBtree->inTran
38b0: 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20  s>=pLock->eLock 
38c0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
38d0: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
38e0: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
38f0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
3900: 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b     assert( pLock
3910: 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c 20 70  ->iTable!=1 || p
3920: 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b 20 29  Lock==&p->lock )
3930: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 6f 63  ;.      if( pLoc
3940: 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29 7b 0a  k->iTable!=1 ){.
3950: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
3960: 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20 20 20  free(pLock);.   
3970: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
3980: 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20 26        ppIter = &
3990: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLock->pNext;.  
39a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
39b0: 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  t( (pBt->btsFlag
39c0: 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
39d0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
39e0: 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ter );.  if( pBt
39f0: 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b 0a  ->pWriter==p ){.
3a00: 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72      pBt->pWriter
3a10: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62   = 0;.    pBt->b
3a20: 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53  tsFlags &= ~(BTS
3a30: 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50  _EXCLUSIVE|BTS_P
3a40: 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c 73 65  ENDING);.  }else
3a50: 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73   if( pBt->nTrans
3a60: 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20 20 20  action==2 ){.   
3a70: 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
3a80: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
3a90: 20 42 74 72 65 65 20 70 20 69 73 20 63 6f 6e 63   Btree p is conc
3aa0: 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20 20 20  luding its .    
3ab0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
3ac0: 49 66 20 74 68 65 72 65 20 63 75 72 72 65 6e 74  If there current
3ad0: 6c 79 20 65 78 69 73 74 73 20 61 20 77 72 69 74  ly exists a writ
3ae0: 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e 6f 74  er, and p is not
3af0: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 72 69  .    ** that wri
3b00: 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20 6e 75  ter, then the nu
3b10: 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
3b20: 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ld by connection
3b30: 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  s other.    ** t
3b40: 68 61 6e 20 74 68 65 20 77 72 69 74 65 72 20 6d  han the writer m
3b50: 75 73 74 20 62 65 20 61 62 6f 75 74 20 74 6f 20  ust be about to 
3b60: 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20 49 6e  drop to zero. In
3b70: 20 74 68 69 73 20 63 61 73 65 0a 20 20 20 20 2a   this case.    *
3b80: 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f 50 45  * set the BTS_PE
3b90: 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20 30 2e  NDING flag to 0.
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 63  f there is not c
3bc0: 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69 74 65  urrently a write
3bd0: 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45 4e 44  r, then BTS_PEND
3be0: 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  ING must.    ** 
3bf0: 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e  be zero already.
3c00: 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20 6c 69   So this next li
3c10: 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73 20 69  ne is harmless i
3c20: 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20 20 20  n that case..   
3c30: 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62 74 73   */.    pBt->bts
3c40: 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 50 45  Flags &= ~BTS_PE
3c50: 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  NDING;.  }.}../*
3c60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
3c70: 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20 77 72  n changes all wr
3c80: 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ite-locks held b
3c90: 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f 20 72  y Btree p into r
3ca0: 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a 73 74  ead-locks..*/.st
3cb0: 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e 67 72  atic void downgr
3cc0: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
3cd0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65  eTableLocks(Btre
3ce0: 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
3cf0: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
3d00: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3d10: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 42 74  ter==p ){.    Bt
3d20: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20 20 20  Lock *pLock;.   
3d30: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20   pBt->pWriter = 
3d40: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46  0;.    pBt->btsF
3d50: 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f 45 58  lags &= ~(BTS_EX
3d60: 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45 4e 44  CLUSIVE|BTS_PEND
3d70: 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28 70 4c  ING);.    for(pL
3d80: 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ock=pBt->pLock; 
3d90: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70 4c 6f  pLock; pLock=pLo
3da0: 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ck->pNext){.    
3db0: 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63 6b 2d    assert( pLock-
3dc0: 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43  >eLock==READ_LOC
3dd0: 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  K || pLock->pBtr
3de0: 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20 20 70  ee==p );.      p
3df0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 52 45  Lock->eLock = RE
3e00: 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  AD_LOCK;.    }. 
3e10: 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   }.}..#endif /* 
3e20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
3e30: 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61  ED_CACHE */..sta
3e40: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
3e50: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
3e60: 61 67 65 29 3b 20 20 20 20 20 20 20 20 20 2f 2a  age);         /*
3e70: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3e80: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ce */.static voi
3e90: 64 20 72 65 6c 65 61 73 65 50 61 67 65 4f 6e 65  d releasePageOne
3ea0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
3eb0: 3b 20 20 20 20 20 20 2f 2a 20 46 6f 72 77 61 72  ;      /* Forwar
3ec0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
3ed0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3ee0: 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d 65  sePageNotNull(Me
3ef0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
3f00: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
3f10: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a  ence */../*.****
3f20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
3f30: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
3f40: 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a   assert() only *
3f50: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79  ***.**.** Verify
3f60: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
3f70: 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78   holds the mutex
3f80: 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65 64   on its BtShared
3f90: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3fa0: 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69  E_DEBUG.static i
3fb0: 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  nt cursorHoldsMu
3fc0: 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29  tex(BtCursor *p)
3fd0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
3fe0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
3ff0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a  >pBt->mutex);.}.
4000: 0a 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  ./* Verify that 
4010: 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74  the cursor and t
4020: 68 65 20 42 74 53 68 61 72 65 64 20 61 67 72 65  he BtShared agre
4030: 65 20 61 62 6f 75 74 20 77 68 61 74 20 69 73 20  e about what is 
4040: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64  the current.** d
4050: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f  atabase connetio
4060: 6e 2e 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  n. This is impor
4070: 74 61 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63  tant in shared-c
4080: 61 63 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68  ache mode. If th
4090: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63  e database .** c
40a0: 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65  onnection pointe
40b0: 72 73 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79  rs get out-of-sy
40c0: 6e 63 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  nc, it is possib
40d0: 6c 65 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20  le for routines 
40e0: 6c 69 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69  like.** btreeIni
40f0: 74 50 61 67 65 28 29 20 74 6f 20 72 65 66 65 72  tPage() to refer
4100: 65 6e 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f  ence an stale co
4110: 6e 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  nnection pointer
4120: 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
4130: 20 61 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69   a.** a connecti
4140: 6f 6e 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  on that has alre
4150: 61 64 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69  ady closed.  Thi
4160: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
4170: 64 20 69 6e 73 69 64 65 20 61 73 73 65 72 74 28  d inside assert(
4180: 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  ).** statements 
4190: 6f 6e 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65  only and for the
41a0: 20 70 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62   purpose of doub
41b0: 6c 65 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74  le-checking that
41c0: 20 74 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a   the btree code.
41d0: 2a 2a 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65  ** does keep the
41e0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
41f0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70  tion pointers up
4200: 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61  -to-date..*/.sta
4210: 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77  tic int cursorOw
4220: 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75 72  nsBtShared(BtCur
4230: 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
4240: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
4250: 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75  tex(p) );.  retu
4260: 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64  rn (p->pBtree->d
4270: 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a  b==p->pBt->db);.
4280: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4290: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
42a0: 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66  verflow cache of
42b0: 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73   the cursor pass
42c0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
42d0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20  argument..** on 
42e0: 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65  the shared btree
42f0: 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a   structure pBt..
4300: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c  */.#define inval
4310: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
4320: 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e  he(pCur) (pCur->
4330: 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
4340: 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a  F_ValidOvfl)../*
4350: 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74  .** Invalidate t
4360: 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
4370: 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20  -list cache for 
4380: 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
4390: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61  ed.** on the sha
43a0: 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74  red btree struct
43b0: 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74  ure pBt..*/.stat
43c0: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
43d0: 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63  teAllOverflowCac
43e0: 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  he(BtShared *pBt
43f0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
4410: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4420: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
4430: 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73  for(p=pBt->pCurs
4440: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4450: 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t){.    invalida
4460: 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
4470: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  p);.  }.}..#ifnd
4480: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
4490: 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68  NCRBLOB./*.** Th
44a0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
44b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64  alled before mod
44c0: 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  ifying the conte
44d0: 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a  nts of a table.*
44e0: 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
44f0: 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72  any incrblob cur
4500: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70  sors that are op
4510: 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77  en on the.** row
4520: 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72   or one of the r
4530: 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  ows being modifi
4540: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  ed..**.** If arg
4550: 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62  ument isClearTab
4560: 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  le is true, then
4570: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4580: 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74  ents of the.** t
4590: 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f  able is about to
45a0: 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20   be deleted. In 
45b0: 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69  this case invali
45c0: 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f  date all incrblo
45d0: 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65  b.** cursors ope
45e0: 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74  n on any row wit
45f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69  hin the table wi
4600: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e  th root-page pgn
4610: 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  oRoot..**.** Oth
4620: 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d  erwise, if argum
4630: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4640: 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
4650: 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20  the row with.** 
4660: 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65  rowid iRow is be
4670: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20  ing replaced or 
4680: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
4690: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
46a0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69  .** only those i
46b0: 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  ncrblob cursors 
46c0: 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65  open on that spe
46d0: 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74  cific row..*/.st
46e0: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
46f0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4700: 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42  ors(.  Btree *pB
4710: 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f  tree,          /
4720: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
4730: 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
4740: 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c    Pgno pgnoRoot,
4750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
4760: 20 74 61 62 6c 65 20 74 68 61 74 20 6d 69 67 68   table that migh
4770: 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
4780: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
4790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
47a0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
47b0: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
47c0: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
47d0: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
47e0: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
47f0: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4800: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4810: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4820: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4830: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4840: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
4850: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
4860: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
4870: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
4880: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
4890: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
48a0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
48b0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
48c0: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
48d0: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
48e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
48f0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4900: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4910: 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 70 67   p->pgnoRoot==pg
4920: 6e 6f 52 6f 6f 74 20 26 26 20 28 69 73 43 6c 65  noRoot && (isCle
4930: 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69 6e  arTable || p->in
4940: 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 20 29  fo.nKey==iRow) )
4950: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4960: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
4970: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
4980: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
4990: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
49a0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
49b0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
49c0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
49d0: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
49e0: 6f 72 73 28 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  ors(w,x,y,z).#en
49f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4a00: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4a10: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4a20: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4a30: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4a40: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4a50: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
4a60: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
4a70: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
4a80: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
4a90: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
4aa0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
4ab0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4ac0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4ad0: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4ae0: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4af0: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4b00: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4b10: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4b20: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4b30: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4b40: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4b50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
4b60: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
4b70: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
4b80: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
4b90: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
4ba0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4bb0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4bc0: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4bd0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4be0: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4bf0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4c00: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4c10: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4c20: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4c30: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4c40: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4c50: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
4c60: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
4c70: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
4c80: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
4c90: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
4ca0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
4cb0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4cc0: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4cd0: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4ce0: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4cf0: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4d00: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4d10: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4d20: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4d30: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4d40: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4d50: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
4d60: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
4d70: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
4d80: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
4d90: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
4da0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
4db0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4dc0: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4dd0: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4de0: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4df0: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4e00: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4e10: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4e20: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4e30: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4e40: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4e50: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
4e60: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
4e70: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
4e80: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
4e90: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
4ea0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
4eb0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4ec0: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4ed0: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4ee0: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4ef0: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4f00: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4f10: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4f20: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4f30: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4f40: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4f50: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4f60: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4f70: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4f80: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4f90: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4fa0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4fb0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4fc0: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4fd0: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4fe0: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4ff0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
5000: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
5010: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
5020: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
5030: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
5040: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
5050: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
5060: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
5070: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
5080: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
5090: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
50a0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
50b0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
50c0: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
50d0: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
50e0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
50f0: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5110: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
5120: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
5130: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
5140: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
5150: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
5160: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
5170: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
5180: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
5190: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
51a0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
51b0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
51c0: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
51d0: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
51e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
51f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
5200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5210: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5220: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
5230: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
5240: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
5250: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
5260: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
5270: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
52a0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
52b0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
52c0: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
52d0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
52e0: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
52f0: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
5300: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
5310: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
5320: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
5330: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
5340: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
5350: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
5360: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
5370: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
5380: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
5390: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
53a0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
53b0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
53c0: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
53d0: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
53e0: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
53f0: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
5400: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
5410: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
5420: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
5430: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
5440: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
5450: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
5460: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
5470: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
5480: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
5490: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
54a0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
54b0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
54c0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
54d0: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
54e0: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
54f0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5500: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5510: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5520: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5530: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5550: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
5560: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
5570: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
5580: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
5590: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
55a0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
55b0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
55c0: 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
55d0: 3e 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  >=0 ){.    for(i
55e0: 3d 30 3b 20 69 3c 70 43 75 72 2d 3e 69 50 61 67  =0; i<pCur->iPag
55f0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  e; i++){.      r
5600: 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
5610: 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
5620: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ]);.    }.    re
5630: 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
5640: 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20  (pCur->pPage);. 
5650: 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
5660: 20 2d 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   -1;.  }.}../*.*
5670: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 70 61 73  * The cursor pas
5680: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
5690: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f  argument must po
56a0: 69 6e 74 20 74 6f 20 61 20 76 61 6c 69 64 20 65  int to a valid e
56b0: 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69  ntry.** when thi
56c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
56d0: 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61 76 65 20  lled (i.e. have 
56e0: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
56f0: 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66  ALID). This.** f
5700: 75 6e 63 74 69 6f 6e 20 73 61 76 65 73 20 74 68  unction saves th
5710: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5720: 20 6b 65 79 20 69 6e 20 76 61 72 69 61 62 6c 65   key in variable
5730: 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  s pCur->nKey and
5740: 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20  .** pCur->pKey. 
5750: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
5760: 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
5770: 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ful or an SQLite
5780: 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20   error .** code 
5790: 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
57a0: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
57b0: 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74  s open on an int
57c0: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
57d0: 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 0a  the integer key.
57e0: 2a 2a 20 28 74 68 65 20 72 6f 77 69 64 29 20 69  ** (the rowid) i
57f0: 73 20 73 74 6f 72 65 64 20 69 6e 20 70 43 75 72  s stored in pCur
5800: 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43 75 72 2d  ->nKey and pCur-
5810: 3e 70 4b 65 79 20 69 73 20 6c 65 66 74 20 73 65  >pKey is left se
5820: 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66  t to.** NULL. If
5830: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
5840: 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74  pen on a non-int
5850: 6b 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  key table, then 
5860: 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a  pCur->pKey is .*
5870: 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  * set to point t
5880: 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66  o a malloced buf
5890: 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62  fer pCur->nKey b
58a0: 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e  ytes in size con
58b0: 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20  taining .** the 
58c0: 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  key..*/.static i
58d0: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79  nt saveCursorKey
58e0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
58f0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
5900: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
5910: 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d  ( CURSOR_VALID==
5920: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a  pCur->eState );.
5930: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75    assert( 0==pCu
5940: 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73  r->pKey );.  ass
5950: 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
5960: 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
5970: 20 20 69 66 28 20 70 43 75 72 2d 3e 63 75 72 49    if( pCur->curI
5980: 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20  ntKey ){.    /* 
5990: 4f 6e 6c 79 20 74 68 65 20 72 6f 77 69 64 20 69  Only the rowid i
59a0: 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61  s required for a
59b0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 2a 2f 0a   table btree */.
59c0: 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d      pCur->nKey =
59d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74   sqlite3BtreeInt
59e0: 65 67 65 72 4b 65 79 28 70 43 75 72 29 3b 0a 20  egerKey(pCur);. 
59f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
5a00: 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 74 72 65  or an index btre
5a10: 65 2c 20 73 61 76 65 20 74 68 65 20 63 6f 6d 70  e, save the comp
5a20: 6c 65 74 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74  lete key content
5a30: 2e 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65  . It is possible
5a40: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65  .    ** that the
5a50: 20 63 75 72 72 65 6e 74 20 6b 65 79 20 69 73 20   current key is 
5a60: 63 6f 72 72 75 70 74 2e 20 49 6e 20 74 68 61 74  corrupt. In that
5a70: 20 63 61 73 65 2c 20 69 74 20 69 73 20 70 6f 73   case, it is pos
5a80: 73 69 62 6c 65 20 74 68 61 74 0a 20 20 20 20 2a  sible that.    *
5a90: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  * the sqlite3Vdb
5aa0: 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
5ab0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6f 76 65  function may ove
5ac0: 72 72 65 61 64 20 74 68 65 20 62 75 66 66 65 72  rread the buffer
5ad0: 20 62 79 0a 20 20 20 20 2a 2a 20 75 70 20 74 6f   by.    ** up to
5ae0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 31 20 76   the size of 1 v
5af0: 61 72 69 6e 74 20 70 6c 75 73 20 31 20 38 2d 62  arint plus 1 8-b
5b00: 79 74 65 20 76 61 6c 75 65 20 77 68 65 6e 20 74  yte value when t
5b10: 68 65 20 63 75 72 73 6f 72 20 0a 20 20 20 20 2a  he cursor .    *
5b20: 2a 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72 65  * position is re
5b30: 73 74 6f 72 65 64 2e 20 48 65 6e 63 65 20 74 68  stored. Hence th
5b40: 65 20 31 37 20 62 79 74 65 73 20 6f 66 20 70 61  e 17 bytes of pa
5b50: 64 64 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 20  dding allocated 
5b60: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2e 20 2a  .    ** below. *
5b70: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79  /.    void *pKey
5b80: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 6e 4b 65 79  ;.    pCur->nKey
5b90: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
5ba0: 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29  ayloadSize(pCur)
5bb0: 3b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73 71 6c  ;.    pKey = sql
5bc0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72  ite3Malloc( pCur
5bd0: 2d 3e 6e 4b 65 79 20 2b 20 39 20 2b 20 38 20 29  ->nKey + 9 + 8 )
5be0: 3b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 20 29  ;.    if( pKey )
5bf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
5c00: 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64  ite3BtreePayload
5c10: 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70  (pCur, 0, (int)p
5c20: 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29  Cur->nKey, pKey)
5c30: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
5c40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5c50: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20       pCur->pKey 
5c60: 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65  = pKey;.      }e
5c70: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5c80: 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b  ite3_free(pKey);
5c90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5ca0: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
5cb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
5cc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
5cd0: 73 65 72 74 28 20 21 70 43 75 72 2d 3e 63 75 72  sert( !pCur->cur
5ce0: 49 6e 74 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d  IntKey || !pCur-
5cf0: 3e 70 4b 65 79 20 29 3b 0a 20 20 72 65 74 75 72  >pKey );.  retur
5d00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
5d10: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
5d20: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
5d30: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
5d40: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
5d50: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
5d60: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
5d70: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
5d80: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
5d90: 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ESEEK..**.** The
5da0: 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73   caller must ens
5db0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
5dc0: 73 6f 72 20 69 73 20 76 61 6c 69 64 20 28 68 61  sor is valid (ha
5dd0: 73 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  s eState==CURSOR
5de0: 5f 56 41 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72  _VALID).** prior
5df0: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   to calling this
5e00: 20 72 6f 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73   routine.  .*/.s
5e10: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75  tatic int saveCu
5e20: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74 43  rsorPosition(BtC
5e30: 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
5e40: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
5e50: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5e60: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c  =pCur->eState ||
5e70: 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54   CURSOR_SKIPNEXT
5e80: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
5e90: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
5ea0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
5eb0: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
5ec0: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
5ed0: 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ..  if( pCur->eS
5ee0: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
5ef0: 50 4e 45 58 54 20 29 7b 0a 20 20 20 20 70 43 75  PNEXT ){.    pCu
5f00: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5f10: 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
5f20: 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  e{.    pCur->ski
5f30: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pNext = 0;.  }..
5f40: 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
5f50: 72 4b 65 79 28 70 43 75 72 29 3b 0a 20 20 69 66  rKey(pCur);.  if
5f60: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5f70: 29 7b 0a 20 20 20 20 62 74 72 65 65 52 65 6c 65  ){.    btreeRele
5f80: 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65  aseAllCursorPage
5f90: 73 28 70 43 75 72 29 3b 0a 20 20 20 20 70 43 75  s(pCur);.    pCu
5fa0: 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
5fb0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 3b 0a  OR_REQUIRESEEK;.
5fc0: 20 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72    }..  pCur->cur
5fd0: 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
5fe0: 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
5ff0: 61 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74  alidOvfl|BTCF_At
6000: 4c 61 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Last);.  return 
6010: 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
6020: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
6030: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
6040: 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75  _NOINLINE saveCu
6050: 72 73 6f 72 73 4f 6e 4c 69 73 74 28 42 74 43 75  rsorsOnList(BtCu
6060: 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72  rsor*,Pgno,BtCur
6070: 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61  sor*);../*.** Sa
6080: 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
6090: 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72 73 20   of all cursors 
60a0: 28 65 78 63 65 70 74 20 70 45 78 63 65 70 74 29  (except pExcept)
60b0: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
60c0: 6e 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 77  n.** the table w
60d0: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52  ith root-page iR
60e0: 6f 6f 74 2e 20 20 22 53 61 76 69 6e 67 20 74 68  oot.  "Saving th
60f0: 65 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  e cursor positio
6100: 6e 22 20 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a  n" means that.**
6110: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e   the location in
6120: 20 74 68 65 20 62 74 72 65 65 20 69 73 20 72 65   the btree is re
6130: 6d 65 6d 62 65 72 65 64 20 69 6e 20 73 75 63 68  membered in such
6140: 20 61 20 77 61 79 20 74 68 61 74 20 69 74 20 63   a way that it c
6150: 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62  an be.** moved b
6160: 61 63 6b 20 74 6f 20 74 68 65 20 73 61 6d 65 20  ack to the same 
6170: 73 70 6f 74 20 61 66 74 65 72 20 74 68 65 20 62  spot after the b
6180: 74 72 65 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  tree has been mo
6190: 64 69 66 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a  dified.  This.**
61a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
61b0: 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 63  ed just before c
61c0: 75 72 73 6f 72 20 70 45 78 63 65 70 74 20 69 73  ursor pExcept is
61d0: 20 75 73 65 64 20 74 6f 20 6d 6f 64 69 66 79 20   used to modify 
61e0: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f  the.** table, fo
61f0: 72 20 65 78 61 6d 70 6c 65 20 69 6e 20 42 74 72  r example in Btr
6200: 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
6210: 72 65 65 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a  reeInsert()..**.
6220: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
6230: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
6240: 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
6250: 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
6260: 73 75 63 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73  such .** cursors
6270: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 74 68 65   should have the
6280: 69 72 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  ir BTCF_Multiple
6290: 20 66 6c 61 67 20 73 65 74 2e 20 20 54 68 65 20   flag set.  The 
62a0: 62 74 72 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a  btreeCursor().**
62b0: 20 72 6f 75 74 69 6e 65 20 65 6e 66 6f 72 63 65   routine enforce
62c0: 73 20 74 68 61 74 20 72 75 6c 65 2e 20 20 54 68  s that rule.  Th
62d0: 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
62e0: 6e 65 65 64 73 20 74 6f 20 62 65 20 63 61 6c 6c  needs to be call
62f0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63  ed in.** the unc
6300: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 6e 20  ommon case when 
6310: 70 45 78 70 65 63 74 20 68 61 73 20 74 68 65 20  pExpect has the 
6320: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
6330: 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  ag set..**.** If
6340: 20 70 45 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61   pExpect!=NULL a
6350: 6e 64 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 63  nd if no other c
6360: 75 72 73 6f 72 73 20 61 72 65 20 66 6f 75 6e 64  ursors are found
6370: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 6f 6f   on the same roo
6380: 74 2d 70 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20  t-page,.** then 
6390: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
63a0: 65 20 66 6c 61 67 20 6f 6e 20 70 45 78 70 65 63  e flag on pExpec
63b0: 74 20 69 73 20 63 6c 65 61 72 65 64 2c 20 74 6f  t is cleared, to
63c0: 20 61 76 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a   avoid another.*
63d0: 2a 20 70 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c  * pointless call
63e0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
63f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ..**.** Implemen
6400: 74 61 74 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68  tation note:  Th
6410: 69 73 20 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c  is routine merel
6420: 79 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  y checks to see 
6430: 69 66 20 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a  if any cursors.*
6440: 2a 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76  * need to be sav
6450: 65 64 2e 20 20 49 74 20 63 61 6c 6c 73 20 6f 75  ed.  It calls ou
6460: 74 20 74 6f 20 73 61 76 65 43 75 72 73 6f 72 73  t to saveCursors
6470: 4f 6e 4c 69 73 74 28 29 20 69 6e 20 74 68 65 20  OnList() in the 
6480: 28 75 6e 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65  (unusual).** eve
6490: 6e 74 20 74 68 61 74 20 63 75 72 73 6f 72 73 20  nt that cursors 
64a0: 61 72 65 20 69 6e 20 6e 65 65 64 20 74 6f 20 62  are in need to b
64b0: 65 69 6e 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73  eing saved..*/.s
64c0: 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 41 6c  tatic int saveAl
64d0: 6c 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  lCursors(BtShare
64e0: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f  d *pBt, Pgno iRo
64f0: 6f 74 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 45  ot, BtCursor *pE
6500: 78 63 65 70 74 29 7b 0a 20 20 42 74 43 75 72 73  xcept){.  BtCurs
6510: 6f 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  or *p;.  assert(
6520: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6530: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
6540: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
6550: 63 65 70 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65  cept==0 || pExce
6560: 70 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  pt->pBt==pBt );.
6570: 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
6580: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
6590: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 21  ext){.    if( p!
65a0: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
65b0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
65c0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62  Root==iRoot) ) b
65d0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  reak;.  }.  if( 
65e0: 70 20 29 20 72 65 74 75 72 6e 20 73 61 76 65 43  p ) return saveC
65f0: 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20  ursorsOnList(p, 
6600: 69 52 6f 6f 74 2c 20 70 45 78 63 65 70 74 29 3b  iRoot, pExcept);
6610: 0a 20 20 69 66 28 20 70 45 78 63 65 70 74 20 29  .  if( pExcept )
6620: 20 70 45 78 63 65 70 74 2d 3e 63 75 72 46 6c 61   pExcept->curFla
6630: 67 73 20 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74  gs &= ~BTCF_Mult
6640: 69 70 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  iple;.  return S
6650: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
6660: 54 68 69 73 20 68 65 6c 70 65 72 20 72 6f 75 74  This helper rout
6670: 69 6e 65 20 74 6f 20 73 61 76 65 41 6c 6c 43 75  ine to saveAllCu
6680: 72 73 6f 72 73 20 64 6f 65 73 20 74 68 65 20 61  rsors does the a
6690: 63 74 75 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61  ctual work of sa
66a0: 76 69 6e 67 0a 2a 2a 20 74 68 65 20 63 75 72 73  ving.** the curs
66b0: 6f 72 73 20 69 66 20 61 6e 64 20 77 68 65 6e 20  ors if and when 
66c0: 61 20 63 75 72 73 6f 72 20 69 73 20 66 6f 75 6e  a cursor is foun
66d0: 64 20 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20  d that actually 
66e0: 72 65 71 75 69 72 65 73 20 73 61 76 69 6e 67 2e  requires saving.
66f0: 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63  .** The common c
6700: 61 73 65 20 69 73 20 74 68 61 74 20 6e 6f 20 63  ase is that no c
6710: 75 72 73 6f 72 73 20 6e 65 65 64 20 74 6f 20 62  ursors need to b
6720: 65 20 73 61 76 65 64 2c 20 73 6f 20 74 68 69 73  e saved, so this
6730: 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62   routine is.** b
6740: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69  roken out from i
6750: 74 73 20 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f  ts caller to avo
6760: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  id unnecessary s
6770: 74 61 63 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76  tack pointer mov
6780: 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
6790: 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
67a0: 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73  LINE saveCursors
67b0: 4f 6e 4c 69 73 74 28 0a 20 20 42 74 43 75 72 73  OnList(.  BtCurs
67c0: 6f 72 20 2a 70 2c 20 20 20 20 20 20 20 20 20 2f  or *p,         /
67d0: 2a 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73  * The first curs
67e0: 6f 72 20 74 68 61 74 20 6e 65 65 64 73 20 73 61  or that needs sa
67f0: 76 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  ving */.  Pgno i
6800: 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20 20 2f  Root,          /
6810: 2a 20 4f 6e 6c 79 20 73 61 76 65 20 63 75 72 73  * Only save curs
6820: 6f 72 20 77 69 74 68 20 74 68 69 73 20 69 52 6f  or with this iRo
6830: 6f 74 2e 20 53 61 76 65 20 61 6c 6c 20 69 66 20  ot. Save all if 
6840: 7a 65 72 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73  zero */.  BtCurs
6850: 6f 72 20 2a 70 45 78 63 65 70 74 20 20 20 20 2f  or *pExcept    /
6860: 2a 20 44 6f 20 6e 6f 74 20 73 61 76 65 20 74 68  * Do not save th
6870: 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  is cursor */.){.
6880: 20 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 70 21    do{.    if( p!
6890: 3d 70 45 78 63 65 70 74 20 26 26 20 28 30 3d 3d  =pExcept && (0==
68a0: 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f  iRoot || p->pgno
68b0: 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a  Root==iRoot) ){.
68c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74        if( p->eSt
68d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
68e0: 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d  D || p->eState==
68f0: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
6900: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
6910: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
6920: 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
6930: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
6940: 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !=rc ){.        
6950: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
6960: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
6970: 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
6980: 63 61 73 65 28 20 70 2d 3e 69 50 61 67 65 3e 3d  case( p->iPage>=
6990: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 62 74 72  0 );.        btr
69a0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
69b0: 6f 72 50 61 67 65 73 28 70 29 3b 0a 20 20 20 20  orPages(p);.    
69c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 20    }.    }.    p 
69d0: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 77  = p->pNext;.  }w
69e0: 68 69 6c 65 28 20 70 20 29 3b 0a 20 20 72 65 74  hile( p );.  ret
69f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
6a00: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68  ../*.** Clear th
6a10: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
6a20: 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   position..*/.vo
6a30: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
6a40: 6c 65 61 72 43 75 72 73 6f 72 28 42 74 43 75 72  learCursor(BtCur
6a50: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
6a60: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
6a70: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
6a80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6a90: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 70 43  Cur->pKey);.  pC
6aa0: 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20  ur->pKey = 0;.  
6ab0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
6ac0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d  URSOR_INVALID;.}
6ad0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
6ae0: 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
6af0: 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
6b00: 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
6b10: 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
6b20: 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
6b30: 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
6b40: 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
6b50: 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
6b60: 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
6b70: 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
6b80: 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
6b90: 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ork..*/.static i
6ba0: 6e 74 20 62 74 72 65 65 4d 6f 76 65 74 6f 28 0a  nt btreeMoveto(.
6bb0: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
6bc0: 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
6bd0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
6be0: 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
6bf0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
6c00: 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
6c10: 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
6c20: 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
6c30: 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
6c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6c50: 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
6c60: 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
6c70: 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
6c80: 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
6c90: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
6ca0: 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
6cb0: 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
6cc0: 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
6cd0: 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
6ce0: 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
6cf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
6d20: 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
6d30: 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
6d40: 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
6d50: 20 6b 65 79 20 2a 2f 0a 0a 20 20 69 66 28 20 70   key */..  if( p
6d60: 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Key ){.    asser
6d70: 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69  t( nKey==(i64)(i
6d80: 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70  nt)nKey );.    p
6d90: 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  IdxKey = sqlite3
6da0: 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
6db0: 64 52 65 63 6f 72 64 28 70 43 75 72 2d 3e 70 4b  dRecord(pCur->pK
6dc0: 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20 69 66 28  eyInfo);.    if(
6dd0: 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20 72 65   pIdxKey==0 ) re
6de0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6df0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69  M_BKPT;.    sqli
6e00: 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
6e10: 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ack(pCur->pKeyIn
6e20: 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70  fo, (int)nKey, p
6e30: 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20  Key, pIdxKey);. 
6e40: 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e     if( pIdxKey->
6e50: 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20 20 20  nField==0 ){.   
6e60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
6e70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
6e80: 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 64     goto moveto_d
6e90: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  one;.    }.  }el
6ea0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6eb0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6ec0: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6ed0: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6ee0: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6ef0: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 6d 6f 76  bias, pRes);.mov
6f00: 65 74 6f 5f 64 6f 6e 65 3a 0a 20 20 69 66 28 20  eto_done:.  if( 
6f10: 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 73  pIdxKey ){.    s
6f20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43 75  qlite3DbFree(pCu
6f30: 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  r->pKeyInfo->db,
6f40: 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20   pIdxKey);.  }. 
6f50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6f60: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6f70: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6f80: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6f90: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6fa0: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
6fb0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
6fc0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
6fd0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
6fe0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
6ff0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
7000: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
7010: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
7020: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
7030: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
7040: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
7050: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
7060: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
7070: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
7080: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
7090: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
70a0: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
70b0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
70c0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
70d0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
70e0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
70f0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
7100: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
7110: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
7120: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
7130: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
7140: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
7150: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
7160: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
7170: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
7180: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
7190: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
71a0: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
71b0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
71c0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
71d0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
71e0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
71f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7210: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
7220: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
7230: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
7240: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
7250: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
7260: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
7270: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
7280: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
7290: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
72a0: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
72b0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
72c0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
72d0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
72e0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
72f0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
7300: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
7310: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
7320: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
7330: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
7340: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
7350: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
7360: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
7370: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
7380: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
7390: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
73a0: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
73b0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
73c0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
73d0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
73e0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
73f0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
7400: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
7410: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
7420: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
7430: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
7440: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
7450: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
7460: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
7470: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
7480: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
7490: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
74a0: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
74b0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
74c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
74d0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
74e0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
74f0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
7500: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
7510: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
7520: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7530: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
7540: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
7550: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
7560: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
7570: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
7580: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
7590: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
75a0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
75b0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
75c0: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
75d0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
75e0: 49 47 4e 4d 45 4e 54 28 70 43 75 72 29 0a 20 20  IGNMENT(pCur).  
75f0: 20 20 20 20 20 7c 7c 20 70 43 75 72 3d 3d 73 71       || pCur==sq
7600: 6c 69 74 65 33 42 74 72 65 65 46 61 6b 65 56 61  lite3BtreeFakeVa
7610: 6c 69 64 43 75 72 73 6f 72 28 29 20 29 3b 0a 20  lidCursor() );. 
7620: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 6f   assert( offseto
7630: 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53 74 61  f(BtCursor, eSta
7640: 74 65 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  te)==0 );.  asse
7650: 72 74 28 20 73 69 7a 65 6f 66 28 70 43 75 72 2d  rt( sizeof(pCur-
7660: 3e 65 53 74 61 74 65 29 3d 3d 31 20 29 3b 0a 20  >eState)==1 );. 
7670: 20 72 65 74 75 72 6e 20 43 55 52 53 4f 52 5f 56   return CURSOR_V
7680: 41 4c 49 44 20 21 3d 20 2a 28 75 38 2a 29 70 43  ALID != *(u8*)pC
7690: 75 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ur;.}../*.** Ret
76a0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
76b0: 20 61 20 66 61 6b 65 20 42 74 43 75 72 73 6f 72   a fake BtCursor
76c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 69 6c   object that wil
76d0: 6c 20 61 6c 77 61 79 73 20 61 6e 73 77 65 72 0a  l always answer.
76e0: 2a 2a 20 66 61 6c 73 65 20 74 6f 20 74 68 65 20  ** false to the 
76f0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
7700: 6f 72 48 61 73 4d 6f 76 65 64 28 29 20 72 6f 75  orHasMoved() rou
7710: 74 69 6e 65 20 61 62 6f 76 65 2e 20 20 54 68 65  tine above.  The
7720: 20 66 61 6b 65 0a 2a 2a 20 63 75 72 73 6f 72 20   fake.** cursor 
7730: 72 65 74 75 72 6e 65 64 20 6d 75 73 74 20 6e 6f  returned must no
7740: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
7750: 6e 79 20 6f 74 68 65 72 20 42 74 72 65 65 20 69  ny other Btree i
7760: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 42 74 43  nterface..*/.BtC
7770: 75 72 73 6f 72 20 2a 73 71 6c 69 74 65 33 42 74  ursor *sqlite3Bt
7780: 72 65 65 46 61 6b 65 56 61 6c 69 64 43 75 72 73  reeFakeValidCurs
7790: 6f 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  or(void){.  stat
77a0: 69 63 20 75 38 20 66 61 6b 65 43 75 72 73 6f 72  ic u8 fakeCursor
77b0: 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
77c0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
77d0: 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 65 53  tof(BtCursor, eS
77e0: 74 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65  tate)==0 );.  re
77f0: 74 75 72 6e 20 28 42 74 43 75 72 73 6f 72 2a 29  turn (BtCursor*)
7800: 26 66 61 6b 65 43 75 72 73 6f 72 3b 0a 7d 0a 0a  &fakeCursor;.}..
7810: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7820: 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63 75  ne restores a cu
7830: 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73  rsor back to its
7840: 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69   original positi
7850: 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68  on after it.** h
7860: 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79  as been moved by
7870: 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63   some outside ac
7880: 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73 20  tivity (such as 
7890: 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63  a btree rebalanc
78a0: 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61  e or.** a row ha
78b0: 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65  ving been delete
78c0: 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
78d0: 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a   the cursor).  .
78e0: 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
78f0: 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e  , the *pDifferen
7900: 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69  tRow parameter i
7910: 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 63  s false if the c
7920: 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  ursor is left.**
7930: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61   pointing at exa
7940: 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f  ctly the same ro
7950: 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f  w.  *pDifferntRo
7960: 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68 65  w is the row the
7970: 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70   cursor.** was p
7980: 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62  ointing to has b
7990: 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72  een deleted, for
79a0: 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  cing the cursor 
79b0: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  to point to some
79c0: 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a  .** nearby row..
79d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
79e0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
79f0: 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63  e called for a c
7a00: 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20  ursor that just 
7a10: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45  returned.** TRUE
7a20: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72   from sqlite3Btr
7a30: 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
7a40: 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
7a50: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
7a60: 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70  tore(BtCursor *p
7a70: 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65  Cur, int *pDiffe
7a80: 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20  rentRow){.  int 
7a90: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
7aa0: 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Cur!=0 );.  asse
7ab0: 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
7ac0: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7ad0: 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
7ae0: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
7af0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
7b00: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7b10: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65  tRow = 1;.    re
7b20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
7b30: 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
7b40: 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
7b50: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
7b60: 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Row = 1;.  }else
7b70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
7b80: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
7b90: 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  );.    *pDiffere
7ba0: 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20  ntRow = 0;.  }. 
7bb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7bc0: 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
7bd0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7be0: 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72  R_HINTS./*.** Pr
7bf0: 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74  ovide hints to t
7c00: 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20  he cursor.  The 
7c10: 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20  particular hint 
7c20: 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74  given (and the t
7c30: 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65  ype.** and numbe
7c40: 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67 73  r of the varargs
7c50: 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73 20   parameters) is 
7c60: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
7c70: 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70  e eHintType.** p
7c80: 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74  arameter.  See t
7c90: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f  he definitions o
7ca0: 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54  f the BTREE_HINT
7cb0: 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65  _* macros for de
7cc0: 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  tails..*/.void s
7cd0: 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
7ce0: 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a  rHint(BtCursor *
7cf0: 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54  pCur, int eHintT
7d00: 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20  ype, ...){.  /* 
7d10: 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73  Used only by sys
7d20: 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69 74  tem that substit
7d30: 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74  ute their own st
7d40: 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  orage engine */.
7d50: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
7d60: 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e  Provide flag hin
7d70: 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  ts to the cursor
7d80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
7d90: 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74  3BtreeCursorHint
7da0: 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a  Flags(BtCursor *
7db0: 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78  pCur, unsigned x
7dc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d  ){.  assert( x==
7dd0: 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c  BTREE_SEEK_EQ ||
7de0: 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f   x==BTREE_BULKLO
7df0: 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20  AD || x==0 );.  
7e00: 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b  pCur->hints = x;
7e10: 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
7e20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
7e30: 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  UUM./*.** Given 
7e40: 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  a page number of
7e50: 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62   a regular datab
7e60: 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e  ase page, return
7e70: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d   the page.** num
7e80: 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e  ber for the poin
7e90: 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61  ter-map page tha
7ea0: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65  t contains the e
7eb0: 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ntry for the.** 
7ec0: 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65  input page numbe
7ed0: 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  r..**.** Return 
7ee0: 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70  0 (not a valid p
7ef0: 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31  age) for pgno==1
7f00: 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a   since there is.
7f10: 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61  ** no pointer ma
7f20: 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  p associated wit
7f30: 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69  h page 1.  The i
7f40: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c  ntegrity_check l
7f50: 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73  ogic.** requires
7f60: 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65   that ptrmapPage
7f70: 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73  no(*,1)!=1..*/.s
7f80: 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61  tatic Pgno ptrma
7f90: 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64  pPageno(BtShared
7fa0: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
7fb0: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50  ){.  int nPagesP
7fc0: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e  erMapPage;.  Pgn
7fd0: 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a  o iPtrMap, ret;.
7fe0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7ff0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
8000: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8010: 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72  ( pgno<2 ) retur
8020: 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72  n 0;.  nPagesPer
8030: 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e  MapPage = (pBt->
8040: 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b  usableSize/5)+1;
8050: 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67  .  iPtrMap = (pg
8060: 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d  no-2)/nPagesPerM
8070: 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20  apPage;.  ret = 
8080: 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50  (iPtrMap*nPagesP
8090: 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20  erMapPage) + 2; 
80a0: 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44  .  if( ret==PEND
80b0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
80c0: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b  t) ){.    ret++;
80d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
80e0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  t;.}../*.** Writ
80f0: 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  e an entry into 
8100: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
8110: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
8120: 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20  ine updates the 
8130: 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
8140: 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65  y for page numbe
8150: 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68  r 'key'.** so th
8160: 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79  at it maps to ty
8170: 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70  pe 'eType' and p
8180: 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65  arent page numbe
8190: 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20  r 'pgno'..**.** 
81a0: 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69  If *pRC is initi
81b0: 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e  ally non-zero (n
81c0: 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68  on-SQLITE_OK) th
81d0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
81e0: 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20  is.** a no-op.  
81f0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8200: 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69  rs, the appropri
8210: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
8220: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
8230: 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69  o *pRC..*/.stati
8240: 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74  c void ptrmapPut
8250: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
8260: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79  Pgno key, u8 eTy
8270: 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c  pe, Pgno parent,
8280: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62   int *pRC){.  Db
8290: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
82a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
82b0: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
82c0: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
82d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
82e0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
82f0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
8300: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8310: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
8320: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
8330: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
8340: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
8350: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
8360: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8370: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
8380: 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20  functions */..  
8390: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
83a0: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  n;..  assert( sq
83b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
83c0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
83d0: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
83e0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
83f0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
8400: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
8410: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
8420: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
8430: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
8440: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
8450: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
8460: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
8470: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
8480: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52  ey==0 ){.    *pR
8490: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
84a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  PT_BKPT;.    ret
84b0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  urn;.  }.  iPtrm
84c0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
84d0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
84e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
84f0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8500: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8510: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8520: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
8530: 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
8540: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
8550: 20 69 66 28 20 28 28 63 68 61 72 2a 29 73 71 6c   if( ((char*)sql
8560: 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
8570: 61 28 70 44 62 50 61 67 65 29 29 5b 30 5d 21 3d  a(pDbPage))[0]!=
8580: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
8590: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
85a0: 65 20 65 78 74 72 61 20 64 61 74 61 20 69 73 20  e extra data is 
85b0: 74 68 65 20 4d 65 6d 50 61 67 65 2e 69 73 49 6e  the MemPage.isIn
85c0: 69 74 20 62 79 74 65 2e 0a 20 20 20 20 2a 2a 20  it byte..    ** 
85d0: 49 66 20 74 68 61 74 20 62 79 74 65 20 69 73 20  If that byte is 
85e0: 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  set, it means th
85f0: 69 73 20 70 61 67 65 20 69 73 20 61 6c 73 6f 20  is page is also 
8600: 62 65 69 6e 67 20 75 73 65 64 0a 20 20 20 20 2a  being used.    *
8610: 2a 20 61 73 20 61 20 62 74 72 65 65 20 70 61 67  * as a btree pag
8620: 65 2e 20 2a 2f 0a 20 20 20 20 2a 70 52 43 20 3d  e. */.    *pRC =
8630: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
8640: 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 70  BKPT;.    goto p
8650: 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20 7d 0a  trmap_exit;.  }.
8660: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
8670: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
8680: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
8690: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
86a0: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
86b0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
86c0: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
86d0: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
86e0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
86f0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
8700: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
8710: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
8720: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
8730: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
8740: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
8750: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
8760: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
8770: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
8780: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
8790: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
87a0: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
87b0: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
87c0: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
87d0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
87e0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
87f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
8800: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
8810: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
8820: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
8830: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
8840: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
8850: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
8860: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
8870: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8880: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
8890: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
88a0: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
88b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
88c0: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
88d0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
88e0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
88f0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
8900: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
8910: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
8920: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
8930: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
8940: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
8950: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
8960: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
8970: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
8980: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
8990: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
89a0: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
89b0: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
89c0: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
89d0: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
89e0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
89f0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
8a00: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
8a10: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
8a20: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
8a30: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8a40: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8a50: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8a60: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8a70: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8a80: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8a90: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8aa0: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8ab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8ac0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8ad0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
8ae0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
8af0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
8b00: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
8b10: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
8b20: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
8b30: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8b40: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8b50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8b60: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8b70: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8b80: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8b90: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8ba0: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8bb0: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8bc0: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8bd0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
8be0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
8bf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8c00: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8c10: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
8c20: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
8c30: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8c40: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8c50: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8c60: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8c70: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8c80: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8c90: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8ca0: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8cb0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8cc0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8cd0: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
8ce0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
8cf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
8d00: 4f 28 69 50 74 72 6d 61 70 29 3b 0a 20 20 72 65  O(iPtrmap);.  re
8d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d20: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
8d30: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
8d40: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
8d50: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d60: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29  pPut(w,x,y,z,rc)
8d70: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
8d80: 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pGet(w,x,y,z) SQ
8d90: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
8da0: 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50  e ptrmapPutOvflP
8db0: 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e  tr(x, y, rc).#en
8dc0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  dif../*.** Given
8dd0: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
8de0: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
8df0: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
8e00: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
8e10: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
8e20: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
8e30: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
8e40: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
8e50: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
8e60: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e  ntent..**.** fin
8e70: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64  dCellPastPtr() d
8e80: 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63  oes the same exc
8e90: 65 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73  ept it skips pas
8ea0: 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  t the initial.**
8eb0: 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
8ec0: 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69  inter found on i
8ed0: 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69  nterior pages, i
8ee0: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a  f there is one..
8ef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
8f00: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
8f10: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
8f20: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
8f30: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
8f40: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
8f50: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8f60: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
8f70: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8f80: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
8f90: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
8fa0: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8fb0: 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a  lPastPtr(P,I) \.
8fc0: 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73    ((P)->aDataOfs
8fd0: 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  t + ((P)->maskPa
8fe0: 67 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69  ge & get2byteAli
8ff0: 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c  gned(&(P)->aCell
9000: 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a  Idx[2*(I)])))...
9010: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f  /*.** This is co
9020: 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73  mmon tail proces
9030: 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61  sing for btreePa
9040: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
9050: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
9060: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72  llPtrIndex() for
9070: 20 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74   the case when t
9080: 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
9090: 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a   fit entirely.**
90a0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74   on a single B-t
90b0: 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20  ree page.  Make 
90c0: 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74  necessary adjust
90d0: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c  ments to the Cel
90e0: 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75  lInfo.** structu
90f0: 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  re..*/.static SQ
9100: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f  LITE_NOINLINE vo
9110: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9120: 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76  lAdjustSizeForOv
9130: 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67  erflow(.  MemPag
9140: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9150: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9160: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9170: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9190: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
91a0: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
91b0: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
91c0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
91d0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
91e0: 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
91f0: 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f   payload will no
9200: 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79  t fit completely
9210: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9220: 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  ge, we have.  **
9230: 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d   to decide how m
9240: 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  uch to store loc
9250: 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63  ally and how muc
9260: 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a  h to spill onto.
9270: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
9280: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
9290: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
92a0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
92b0: 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63  unused.  ** spac
92c0: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
92d0: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
92e0: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
92f0: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
9300: 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69  ** in between mi
9310: 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f  nLocal and maxLo
9320: 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  cal..  **.  ** W
9330: 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e  arning:  changin
9340: 67 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c  g the way overfl
9350: 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69  ow payload is di
9360: 73 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79  stributed in any
9370: 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72  .  ** way will r
9380: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f  esult in an inco
9390: 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f  mpatible file fo
93a0: 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  rmat..  */.  int
93b0: 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   minLocal;  /* M
93c0: 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  inimum amount of
93d0: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
93e0: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d  cally */.  int m
93f0: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
9400: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
9410: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
9420: 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72  lly */.  int sur
9430: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
9440: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
9450: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
9460: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69  storage */..  mi
9470: 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  nLocal = pPage->
9480: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c  minLocal;.  maxL
9490: 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61  ocal = pPage->ma
94a0: 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75  xLocal;.  surplu
94b0: 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28  s = minLocal + (
94c0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
94d0: 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61  - minLocal)%(pPa
94e0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
94f0: 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61  ize-4);.  testca
9500: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
9510: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
9520: 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61  ase( surplus==ma
9530: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9540: 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78  ( surplus <= max
9550: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e  Local ){.    pIn
9560: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9570: 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c  6)surplus;.  }el
9580: 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  se{.    pInfo->n
9590: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e  Local = (u16)min
95a0: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e  Local;.  }.  pIn
95b0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75 31 36  fo->nSize = (u16
95c0: 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  )(&pInfo->pPaylo
95d0: 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c  ad[pInfo->nLocal
95e0: 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34 3b 0a  ] - pCell) + 4;.
95f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9600: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
9610: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
9620: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
9630: 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28 29 0a  ge.xParseCell().
9640: 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a  ** method..**.**
9650: 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20 63 6f   Parse a cell co
9660: 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e 64 20  ntent block and 
9670: 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65 6c 6c  fill in the Cell
9680: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a  Info structure..
9690: 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  **.** btreeParse
96a0: 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20 20 20  CellPtr()       
96b0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
96c0: 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2a 20  e leaf nodes.** 
96d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 4e 6f  btreeParseCellNo
96e0: 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20 20 20  Payload()  =>   
96f0: 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e 74 65  table btree inte
9700: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 62 74  rnal nodes.** bt
9710: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9720: 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20 69 6e  ndex()   =>   in
9730: 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65 73 0a  dex btree nodes.
9740: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61  **.** There is a
9750: 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20 66 75  lso a wrapper fu
9760: 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61 72 73  nction btreePars
9770: 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  eCell() that wor
9780: 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 4d 65  ks for.** all Me
9790: 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e 64 20  mPage types and 
97a0: 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20  that references 
97b0: 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e 64 65  the cell by inde
97c0: 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a 2a 2a  x rather than.**
97d0: 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a   by pointer..*/.
97e0: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
97f0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e 6f 50  eParseCellPtrNoP
9800: 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50 61 67  ayload(.  MemPag
9810: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9820: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9830: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9840: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
9850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
9860: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
9870: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
9880: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9890: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
98a0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
98b0: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  /.){.  assert( s
98c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
98d0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
98e0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
98f0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
9900: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
9910: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
9920: 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65 66 20  e==4 );.#ifndef 
9930: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 55  SQLITE_DEBUG.  U
9940: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9950: 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pPage);.#endif. 
9960: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
9970: 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28 26 70  4 + getVarint(&p
9980: 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a 29 26  Cell[4], (u64*)&
9990: 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20  pInfo->nKey);.  
99a0: 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20  pInfo->nPayload 
99b0: 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4c  = 0;.  pInfo->nL
99c0: 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49 6e 66  ocal = 0;.  pInf
99d0: 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30 3b  o->pPayload = 0;
99e0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74 61  .  return;.}.sta
99f0: 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61  tic void btreePa
9a00: 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d 65  rseCellPtr(.  Me
9a10: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
9a20: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
9a30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
9a40: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
9a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
9a60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
9a70: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
9a80: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9aa0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9ab0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70  re */.){.  u8 *p
9ac0: 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  Iter;           
9ad0: 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69     /* For scanni
9ae0: 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c  ng through pCell
9af0: 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f   */.  u32 nPaylo
9b00: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad;           /*
9b10: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
9b20: 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64   of cell payload
9b30: 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b 20   */.  u64 iKey; 
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9b50: 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20 76   Extracted Key v
9b60: 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  alue */..  asser
9b70: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
9b80: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
9b90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
9ba0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
9bb0: 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c  f==0 || pPage->l
9bc0: 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  eaf==1 );.  asse
9bd0: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
9be0: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
9bf0: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
9c00: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
9c10: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
9c20: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9c30: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
9c40: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
9c50: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
9c60: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
9c70: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
9c80: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
9c90: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9ca0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9cb0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9cc0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9cd0: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
9ce0: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
9cf0: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9d00: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9d10: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9d20: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9d30: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
9d40: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
9d50: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
9d60: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
9d70: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
9d80: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
9d90: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9da0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9db0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9dc0: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9dd0: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9de0: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
9df0: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9e00: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9e10: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9e20: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9e30: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
9e40: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
9e50: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
9e60: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
9e70: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
9e80: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
9e90: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9ea0: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9eb0: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9ec0: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9ed0: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
9ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
9ef0: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
9f00: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
9f10: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
9f20: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
9f30: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
9f40: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
9f50: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
9f60: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
9f70: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
9f80: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
9f90: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9fa0: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9fb0: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9fc0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9fd0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
9fe0: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9ff0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a000: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
a010: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a020: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
a030: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
a040: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
a050: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
a060: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
a070: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
a080: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
a090: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
a0a0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
a0b0: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
a0c0: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a0d0: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
a0e0: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
a0f0: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
a100: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
a110: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
a120: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62  ;.  }else{.    b
a130: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a  treeParseCellAdj
a140: 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c  ustSizeForOverfl
a150: 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ow(pPage, pCell,
a160: 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73   pInfo);.  }.}.s
a170: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
a180: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
a190: 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x(.  MemPage *pP
a1a0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
a1b0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
a1c0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
a1d0: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
a1e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
a1f0: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
a200: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
a210: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
a220: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
a230: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
a240: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
a250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
a260: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
a270: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
a280: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
a290: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
a2a0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
a2b0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73  payload */..  as
a2c0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
a2d0: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
a2e0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
a2f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a300: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
a310: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
a320: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
a330: 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  tKeyLeaf==0 );. 
a340: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
a350: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a360: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
a370: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
a380: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
a390: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
a3a0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
a3b0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
a3c0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a3d0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
a3e0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
a3f0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
a400: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
a410: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
a420: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
a430: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
a440: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
a450: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
a460: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
a470: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
a480: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
a490: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
a4a0: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
a4b0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4c0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
a4d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
a4e0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
a4f0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
a500: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
a510: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
a520: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
a530: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
a540: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
a550: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
a560: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
a570: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
a580: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
a590: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
a5a0: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
a5b0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
a5c0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
a5d0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
a5e0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
a5f0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
a600: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
a610: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
a620: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
a630: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
a640: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
a650: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
a660: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
a670: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
a680: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
a690: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
a6a0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
a6b0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
a6c0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
a6d0: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
a6e0: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
a6f0: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
a700: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
a710: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
a720: 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73  {.  pPage->xPars
a730: 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66 69 6e  eCell(pPage, fin
a740: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  dCell(pPage, iCe
a750: 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d 0a 0a  ll), pInfo);.}..
a760: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
a770: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ing routines are
a780: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
a790: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e   of the MemPage.
a7a0: 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d 65 74  xCellSize.** met
a7b0: 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 75  hod..**.** Compu
a7c0: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  te the total num
a7d0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 68 61  ber of bytes tha
a7e0: 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73 20 69  t a Cell needs i
a7f0: 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61  n the cell.** da
a800: 74 61 20 61 72 65 61 20 6f 66 20 74 68 65 20 62  ta area of the b
a810: 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68 65 20  tree-page.  The 
a820: 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20 69 6e  return number in
a830: 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c 6c 0a  cludes the cell.
a840: 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72 20 61  ** data header a
a850: 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 79  nd the local pay
a860: 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20 61 6e  load, but not an
a870: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  y overflow page 
a880: 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63 65 20  or.** the space 
a890: 75 73 65 64 20 62 79 20 74 68 65 20 63 65 6c 6c  used by the cell
a8a0: 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20   pointer..**.** 
a8b0: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
a8c0: 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20 20 74  load()    =>   t
a8d0: 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f  able internal no
a8e0: 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  des.** cellSizeP
a8f0: 74 72 28 29 20 20 20 20 20 20 20 20 20 20 20 20  tr()            
a900: 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65 78 20   =>   all index 
a910: 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20 6c 65  nodes & table le
a920: 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74 61 74  af nodes.*/.stat
a930: 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50  ic u16 cellSizeP
a940: 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  tr(MemPage *pPag
a950: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a960: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a970: 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c  ll + pPage->chil
a980: 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46 6f 72  dPtrSize; /* For
a990: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79   looping over by
a9a0: 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a  tes of pCell */.
a9b0: 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20    u8 *pEnd;     
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
a9e0: 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61 72  d mark for a var
a9f0: 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e 53 69  int */.  u32 nSi
aa00: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75 65 20    /* Size value 
aa30: 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 23 69  to return */..#i
aa40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
aa50: 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  G.  /* The value
aa60: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
aa70: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
aa80: 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  d always be the 
aa90: 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  same as.  ** the
aaa0: 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65   (CellInfo.nSize
aab0: 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79  ) value found by
aac0: 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61   doing a full pa
aad0: 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  rse of the.  ** 
aae0: 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f  cell. If SQLITE_
aaf0: 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
ab00: 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61 74  , an assert() at
ab10: 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20   the bottom of. 
ab20: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
ab30: 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74 20  n verifies that 
ab40: 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  this invariant i
ab50: 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20  s not violated. 
ab60: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65  */.  CellInfo de
ab70: 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65  buginfo;.  pPage
ab80: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
ab90: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75  ge, pCell, &debu
aba0: 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a  ginfo);.#endif..
abb0: 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74 65 72    nSize = *pIter
abc0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e 3d 30  ;.  if( nSize>=0
abd0: 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e 64 20  x80 ){.    pEnd 
abe0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
abf0: 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66 3b 0a   nSize &= 0x7f;.
ac00: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 53      do{.      nS
ac10: 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c 37 29  ize = (nSize<<7)
ac20: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
ac30: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
ac40: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
ac50: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
ac60: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
ac70: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
ac80: 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 70  tKey ){.    /* p
ac90: 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74 73 20  Iter now points 
aca0: 61 74 20 74 68 65 20 36 34 2d 62 69 74 20 69 6e  at the 64-bit in
acb0: 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75 65 2c  teger key value,
acc0: 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65 6e 67   a variable leng
acd0: 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  th .    ** integ
ace0: 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
acf0: 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20 70 49  g block moves pI
ad00: 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ter to point at 
ad10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 20  the first byte. 
ad20: 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20 65     ** past the e
ad30: 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20 76 61  nd of the key va
ad40: 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45 6e 64  lue. */.    pEnd
ad50: 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a 20 20   = &pIter[9];.  
ad60: 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72    while( (*pIter
ad70: 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65  ++)&0x80 && pIte
ad80: 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20  r<pEnd );.  }.  
ad90: 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d  testcase( nSize=
ada0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
adb0: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
adc0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
add0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
ade0: 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65 2d 3e  ( nSize<=pPage->
adf0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
ae00: 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29 28 70  nSize += (u32)(p
ae10: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  Iter - pCell);. 
ae20: 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29     if( nSize<4 )
ae30: 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 7d 65   nSize = 4;.  }e
ae40: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  lse{.    int min
ae50: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
ae60: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 53 69  inLocal;.    nSi
ae70: 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20  ze = minLocal + 
ae80: 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f 63 61  (nSize - minLoca
ae90: 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74  l) % (pPage->pBt
aea0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
aeb0: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
aec0: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
aed0: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74  axLocal );.    t
aee0: 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d  estcase( nSize==
aef0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
af00: 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  1 );.    if( nSi
af10: 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  ze>pPage->maxLoc
af20: 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53 69 7a  al ){.      nSiz
af30: 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  e = minLocal;.  
af40: 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d    }.    nSize +=
af50: 20 34 20 2b 20 28 75 31 36 29 28 70 49 74 65 72   4 + (u16)(pIter
af60: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20   - pCell);.  }. 
af70: 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65 3d 3d   assert( nSize==
af80: 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 20  debuginfo.nSize 
af90: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
afa0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 6e  .  return (u16)n
afb0: 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63 20 75  Size;.}.static u
afc0: 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  16 cellSizePtrNo
afd0: 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67 65 20  Payload(MemPage 
afe0: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
aff0: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
b000: 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f 2a 20  = pCell + 4; /* 
b010: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
b020: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
b030: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
b040: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
b050: 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76 61  nd mark for a va
b060: 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20  rint */..#ifdef 
b070: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
b080: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
b090: 72 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  rned by this fun
b0a0: 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  ction should alw
b0b0: 61 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20  ays be the same 
b0c0: 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c  as.  ** the (Cel
b0d0: 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c  lInfo.nSize) val
b0e0: 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e  ue found by doin
b0f0: 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f  g a full parse o
b100: 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  f the.  ** cell.
b110: 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47   If SQLITE_DEBUG
b120: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20   is defined, an 
b130: 61 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20  assert() at the 
b140: 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74  bottom of.  ** t
b150: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72  his function ver
b160: 69 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20  ifies that this 
b170: 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74  invariant is not
b180: 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20   violated. */.  
b190: 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e  CellInfo debugin
b1a0: 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  fo;.  pPage->xPa
b1b0: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
b1c0: 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f  Cell, &debuginfo
b1d0: 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
b1e0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 67  D_PARAMETER(pPag
b1f0: 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  e);.#endif..  as
b200: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
b210: 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a  ldPtrSize==4 );.
b220: 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72 20 2b    pEnd = pIter +
b230: 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28 2a 70   9;.  while( (*p
b240: 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20  Iter++)&0x80 && 
b250: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
b260: 61 73 73 65 72 74 28 20 64 65 62 75 67 69 6e 66  assert( debuginf
b270: 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29 28 70  o.nSize==(u16)(p
b280: 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20 7c 7c  Iter - pCell) ||
b290: 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
b2a0: 20 72 65 74 75 72 6e 20 28 75 31 36 29 28 70 49   return (u16)(pI
b2b0: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 7d 0a  ter - pCell);.}.
b2c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
b2d0: 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 76 61  DEBUG./* This va
b2e0: 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c 6c 53  riation on cellS
b2f0: 69 7a 65 50 74 72 28 29 20 69 73 20 75 73 65 64  izePtr() is used
b300: 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72   inside of asser
b310: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  t() statements.*
b320: 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61 74 69  * only. */.stati
b330: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 28 4d  c u16 cellSize(M
b340: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
b350: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72 65 74  nt iCell){.  ret
b360: 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c  urn pPage->xCell
b370: 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69 6e 64  Size(pPage, find
b380: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
b390: 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  l));.}.#endif..#
b3a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b3b0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
b3c0: 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
b3d0: 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66 20 70  pCell, part of p
b3e0: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
b3f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
b400: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
b410: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
b420: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
b430: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
b440: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
b450: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
b460: 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c  id ptrmapPutOvfl
b470: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
b480: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c 20 69  ge, u8 *pCell, i
b490: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65 6c 6c  nt *pRC){.  Cell
b4a0: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69 66 28  Info info;.  if(
b4b0: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
b4c0: 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 21    assert( pCell!
b4d0: 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  =0 );.  pPage->x
b4e0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
b4f0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
b500: 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
b510: 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  l<info.nPayload 
b520: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
b530: 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
b540: 5f 57 49 54 48 49 4e 28 70 50 61 67 65 2d 3e 61  _WITHIN(pPage->a
b550: 44 61 74 61 45 6e 64 2c 20 70 43 65 6c 6c 2c 20  DataEnd, pCell, 
b560: 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 4c 6f 63 61  pCell+info.nLoca
b570: 6c 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  l) ){.      *pRC
b580: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
b590: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
b5a0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
b5b0: 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  ovfl = get4byte(
b5c0: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a  &pCell[info.nSiz
b5d0: 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  e-4]);.    ptrma
b5e0: 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
b5f0: 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56   ovfl, PTRMAP_OV
b600: 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
b610: 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a  pgno, pRC);.  }.
b620: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b630: 20 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20   Defragment the 
b640: 70 61 67 65 20 67 69 76 65 6e 2e 20 54 68 69 73  page given. This
b650: 20 72 6f 75 74 69 6e 65 20 72 65 6f 72 67 61 6e   routine reorgan
b660: 69 7a 65 73 20 63 65 6c 6c 73 20 77 69 74 68 69  izes cells withi
b670: 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 73 6f  n the.** page so
b680: 20 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20   that there are 
b690: 6e 6f 20 66 72 65 65 2d 62 6c 6f 63 6b 73 20 6f  no free-blocks o
b6a0: 6e 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b  n the free-block
b6b0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72   list..**.** Par
b6c0: 61 6d 65 74 65 72 20 6e 4d 61 78 46 72 61 67 20  ameter nMaxFrag 
b6d0: 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61  is the maximum a
b6e0: 6d 6f 75 6e 74 20 6f 66 20 66 72 61 67 6d 65 6e  mount of fragmen
b6f0: 74 65 64 20 73 70 61 63 65 20 74 68 61 74 20 6d  ted space that m
b700: 61 79 20 62 65 0a 2a 2a 20 70 72 65 73 65 6e 74  ay be.** present
b710: 20 69 6e 20 74 68 65 20 70 61 67 65 20 61 66 74   in the page aft
b720: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
b730: 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 45  returns..**.** E
b740: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
b750: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
b760: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
b770: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
b780: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
b790: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
b7a0: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
b7b0: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
b7c0: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
b7d0: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
b7e0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
b7f0: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
b800: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
b810: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
b820: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
b830: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
b840: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
b850: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
b860: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
b870: 2c 20 69 6e 74 20 6e 4d 61 78 46 72 61 67 29 7b  , int nMaxFrag){
b880: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
b8b0: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b8d0: 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   Address of the 
b8e0: 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  i-th cell */.  i
b8f0: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
b900: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
b910: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
b920: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
b930: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
b940: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b950: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
b960: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
b970: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b980: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
b990: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
b9a0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
b9b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b9c0: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
b9d0: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
b9e0: 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b 20   */.  int cbrk; 
b9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba00: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
ba10: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
ba20: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
ba30: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
ba40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ba50: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
ba60: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
ba70: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
ba80: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
ba90: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
baa0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
bab0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
bac0: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
bad0: 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  t */.  unsigned 
bae0: 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20 20  char *src;      
baf0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20 63    /* Source of c
bb00: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  ontent */.  int 
bb10: 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20 20  iCellFirst;     
bb20: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
bb30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 69  allowable cell i
bb40: 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 43  ndex */.  int iC
bb50: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20 20  ellLast;        
bb60: 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f 73       /* Last pos
bb70: 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  sible cell index
bb80: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
bb90: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
bba0: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
bbb0: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
bbc0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
bbd0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
bbe0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
bbf0: 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f  eSize <= SQLITE_
bc00: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
bc10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
bc20: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
bc30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bc40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bc50: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
bc60: 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b  ) );.  temp = 0;
bc70: 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20 3d 20  .  src = data = 
bc80: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
bc90: 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
bca0: 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66  Offset;.  cellOf
bcb0: 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65  fset = pPage->ce
bcc0: 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c  llOffset;.  nCel
bcd0: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
bce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c  ;.  assert( nCel
bcf0: 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74  l==get2byte(&dat
bd00: 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20 20 69  a[hdr+3]) );.  i
bd10: 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c  CellFirst = cell
bd20: 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c  Offset + 2*nCell
bd30: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
bd40: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
bd50: 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 54  bleSize;..  /* T
bd60: 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65  his block handle
bd70: 73 20 70 61 67 65 73 20 77 69 74 68 20 74 77 6f  s pages with two
bd80: 20 6f 72 20 66 65 77 65 72 20 66 72 65 65 20 62   or fewer free b
bd90: 6c 6f 63 6b 73 20 61 6e 64 20 6e 4d 61 78 46 72  locks and nMaxFr
bda0: 61 67 0a 20 20 2a 2a 20 6f 72 20 66 65 77 65 72  ag.  ** or fewer
bdb0: 20 66 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65   fragmented byte
bdc0: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  s. In this case 
bdd0: 69 74 20 69 73 20 66 61 73 74 65 72 20 74 6f 20  it is faster to 
bde0: 6d 6f 76 65 20 74 68 65 0a 20 20 2a 2a 20 74 77  move the.  ** tw
bdf0: 6f 20 28 6f 72 20 6f 6e 65 29 20 62 6c 6f 63 6b  o (or one) block
be00: 73 20 6f 66 20 63 65 6c 6c 73 20 75 73 69 6e 67  s of cells using
be10: 20 6d 65 6d 6d 6f 76 65 28 29 20 61 6e 64 20 61   memmove() and a
be20: 64 64 20 74 68 65 20 72 65 71 75 69 72 65 64 0a  dd the required.
be30: 20 20 2a 2a 20 6f 66 66 73 65 74 73 20 74 6f 20    ** offsets to 
be40: 65 61 63 68 20 70 6f 69 6e 74 65 72 20 69 6e 20  each pointer in 
be50: 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
be60: 20 61 72 72 61 79 20 74 68 61 6e 20 69 74 20 69   array than it i
be70: 73 20 74 6f 20 0a 20 20 2a 2a 20 72 65 63 6f 6e  s to .  ** recon
be80: 73 74 72 75 63 74 20 74 68 65 20 65 6e 74 69 72  struct the entir
be90: 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 69 66  e page.  */.  if
bea0: 28 20 28 69 6e 74 29 64 61 74 61 5b 68 64 72 2b  ( (int)data[hdr+
beb0: 37 5d 3c 3d 6e 4d 61 78 46 72 61 67 20 29 7b 0a  7]<=nMaxFrag ){.
bec0: 20 20 20 20 69 6e 74 20 69 46 72 65 65 20 3d 20      int iFree = 
bed0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
bee0: 64 72 2b 31 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  dr+1]);..    /* 
bef0: 49 66 20 74 68 65 20 69 6e 69 74 69 61 6c 20 66  If the initial f
bf00: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
bf10: 77 65 72 65 20 6f 75 74 20 6f 66 20 62 6f 75 6e  were out of boun
bf20: 64 73 2c 20 74 68 61 74 20 77 6f 75 6c 64 0a 20  ds, that would. 
bf30: 20 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20     ** have been 
bf40: 64 65 74 65 63 74 65 64 20 62 79 20 62 74 72 65  detected by btre
bf50: 65 49 6e 69 74 50 61 67 65 28 29 20 77 68 65 6e  eInitPage() when
bf60: 20 69 74 20 77 61 73 20 63 6f 6d 70 75 74 69 6e   it was computin
bf70: 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  g the.    ** num
bf80: 62 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65  ber of free byte
bf90: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 2a  s on the page. *
bfa0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46  /.    assert( iF
bfb0: 72 65 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d  ree<=usableSize-
bfc0: 34 20 29 3b 0a 20 20 20 20 69 66 28 20 69 46 72  4 );.    if( iFr
bfd0: 65 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ee ){.      int 
bfe0: 69 46 72 65 65 32 20 3d 20 67 65 74 32 62 79 74  iFree2 = get2byt
bff0: 65 28 26 64 61 74 61 5b 69 46 72 65 65 5d 29 3b  e(&data[iFree]);
c000: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
c010: 32 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  2>usableSize-4 )
c020: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
c030: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
c040: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  e);.      if( 0=
c050: 3d 69 46 72 65 65 32 20 7c 7c 20 28 64 61 74 61  =iFree2 || (data
c060: 5b 69 46 72 65 65 32 5d 3d 3d 30 20 26 26 20 64  [iFree2]==0 && d
c070: 61 74 61 5b 69 46 72 65 65 32 2b 31 5d 3d 3d 30  ata[iFree2+1]==0
c080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  ) ){.        u8 
c090: 2a 70 45 6e 64 20 3d 20 26 64 61 74 61 5b 63 65  *pEnd = &data[ce
c0a0: 6c 6c 4f 66 66 73 65 74 20 2b 20 6e 43 65 6c 6c  llOffset + nCell
c0b0: 2a 32 5d 3b 0a 20 20 20 20 20 20 20 20 75 38 20  *2];.        u8 
c0c0: 2a 70 41 64 64 72 3b 0a 20 20 20 20 20 20 20 20  *pAddr;.        
c0d0: 69 6e 74 20 73 7a 32 20 3d 20 30 3b 0a 20 20 20  int sz2 = 0;.   
c0e0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 67 65       int sz = ge
c0f0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
c100: 65 65 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  ee+2]);.        
c110: 69 6e 74 20 74 6f 70 20 3d 20 67 65 74 32 62 79  int top = get2by
c120: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
c130: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 6f  ;.        if( to
c140: 70 3e 3d 69 46 72 65 65 20 29 7b 0a 20 20 20 20  p>=iFree ){.    
c150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c160: 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45  ITE_CORRUPT_PAGE
c170: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
c180: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
c190: 46 72 65 65 32 20 29 7b 0a 20 20 20 20 20 20 20  Free2 ){.       
c1a0: 20 20 20 69 66 28 20 69 46 72 65 65 2b 73 7a 3e     if( iFree+sz>
c1b0: 69 46 72 65 65 32 20 29 20 72 65 74 75 72 6e 20  iFree2 ) return 
c1c0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
c1d0: 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
c1e0: 20 20 20 20 20 20 73 7a 32 20 3d 20 67 65 74 32        sz2 = get2
c1f0: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
c200: 32 2b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  2+2]);.         
c210: 20 69 66 28 20 69 46 72 65 65 32 2b 73 7a 32 20   if( iFree2+sz2 
c220: 3e 20 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72  > usableSize ) r
c230: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
c240: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
c250: 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6d  ;.          memm
c260: 6f 76 65 28 26 64 61 74 61 5b 69 46 72 65 65 2b  ove(&data[iFree+
c270: 73 7a 2b 73 7a 32 5d 2c 20 26 64 61 74 61 5b 69  sz+sz2], &data[i
c280: 46 72 65 65 2b 73 7a 5d 2c 20 69 46 72 65 65 32  Free+sz], iFree2
c290: 2d 28 69 46 72 65 65 2b 73 7a 29 29 3b 0a 20 20  -(iFree+sz));.  
c2a0: 20 20 20 20 20 20 20 20 73 7a 20 2b 3d 20 73 7a          sz += sz
c2b0: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
c2c0: 20 20 20 20 20 63 62 72 6b 20 3d 20 74 6f 70 2b       cbrk = top+
c2d0: 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
c2e0: 72 74 28 20 63 62 72 6b 2b 28 69 46 72 65 65 2d  rt( cbrk+(iFree-
c2f0: 74 6f 70 29 20 3c 3d 20 75 73 61 62 6c 65 53 69  top) <= usableSi
c300: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ze );.        me
c310: 6d 6d 6f 76 65 28 26 64 61 74 61 5b 63 62 72 6b  mmove(&data[cbrk
c320: 5d 2c 20 26 64 61 74 61 5b 74 6f 70 5d 2c 20 69  ], &data[top], i
c330: 46 72 65 65 2d 74 6f 70 29 3b 0a 20 20 20 20 20  Free-top);.     
c340: 20 20 20 66 6f 72 28 70 41 64 64 72 3d 26 64 61     for(pAddr=&da
c350: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20  ta[cellOffset]; 
c360: 70 41 64 64 72 3c 70 45 6e 64 3b 20 70 41 64 64  pAddr<pEnd; pAdd
c370: 72 2b 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 20  r+=2){.         
c380: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
c390: 41 64 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Addr);.         
c3a0: 20 69 66 28 20 70 63 3c 69 46 72 65 65 20 29 7b   if( pc<iFree ){
c3b0: 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72 2c   put2byte(pAddr,
c3c0: 20 70 63 2b 73 7a 29 3b 20 7d 0a 20 20 20 20 20   pc+sz); }.     
c3d0: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 63       else if( pc
c3e0: 3c 69 46 72 65 65 32 20 29 7b 20 70 75 74 32 62  <iFree2 ){ put2b
c3f0: 79 74 65 28 70 41 64 64 72 2c 20 70 63 2b 73 7a  yte(pAddr, pc+sz
c400: 32 29 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a  2); }.        }.
c410: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 66          goto def
c420: 72 61 67 6d 65 6e 74 5f 6f 75 74 3b 0a 20 20 20  ragment_out;.   
c430: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
c440: 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65 53    cbrk = usableS
c450: 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ize;.  iCellLast
c460: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
c470: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
c480: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
c490: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
c4a0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
c4b0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
c4c0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
c4d0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
c4e0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
c4f0: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
c500: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c510: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
c520: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
c530: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
c540: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
c550: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
c560: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
c570: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
c580: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
c590: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
c5a0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
c5b0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
c5c0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
c5d0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
c5e0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c5f0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
c600: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
c610: 70 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26  pc>=iCellFirst &
c620: 26 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20  & pc<=iCellLast 
c630: 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50  );.    size = pP
c640: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  age->xCellSize(p
c650: 50 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b  Page, &src[pc]);
c660: 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a  .    cbrk -= siz
c670: 65 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c  e;.    if( cbrk<
c680: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
c690: 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65  +size>usableSize
c6a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
c6b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
c6c0: 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
c6d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
c6e0: 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65  brk+size<=usable
c6f0: 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43  Size && cbrk>=iC
c700: 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20  ellFirst );.    
c710: 74 65 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73  testcase( cbrk+s
c720: 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  ize==usableSize 
c730: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
c740: 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65   pc+size==usable
c750: 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32  Size );.    put2
c760: 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b  byte(pAddr, cbrk
c770: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d  );.    if( temp=
c780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
c790: 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 72  x;.      if( cbr
c7a0: 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65  k==pc ) continue
c7b0: 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73  ;.      temp = s
c7c0: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
c7d0: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
c7e0: 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  >pPager);.      
c7f0: 78 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  x = get2byte(&da
c800: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20  ta[hdr+5]);.    
c810: 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78    memcpy(&temp[x
c820: 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62  ], &data[x], (cb
c830: 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20  rk+size) - x);. 
c840: 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b       src = temp;
c850: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
c860: 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26  y(&data[cbrk], &
c870: 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a  src[pc], size);.
c880: 20 20 7d 0a 20 20 64 61 74 61 5b 68 64 72 2b 37    }.  data[hdr+7
c890: 5d 20 3d 20 30 3b 0a 0a 20 64 65 66 72 61 67 6d  ] = 0;.. defragm
c8a0: 65 6e 74 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64  ent_out:.  if( d
c8b0: 61 74 61 5b 68 64 72 2b 37 5d 2b 63 62 72 6b 2d  ata[hdr+7]+cbrk-
c8c0: 69 43 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67  iCellFirst!=pPag
c8d0: 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
c8e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
c8f0: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
c900: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
c910: 20 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73   cbrk>=iCellFirs
c920: 74 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  t );.  put2byte(
c930: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62  &data[hdr+5], cb
c940: 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  rk);.  data[hdr+
c950: 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68  1] = 0;.  data[h
c960: 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d  dr+2] = 0;.  mem
c970: 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46  set(&data[iCellF
c980: 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69  irst], 0, cbrk-i
c990: 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73  CellFirst);.  as
c9a0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
c9b0: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
c9c0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
c9d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c9e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
c9f0: 61 72 63 68 20 74 68 65 20 66 72 65 65 2d 6c 69  arch the free-li
ca00: 73 74 20 6f 6e 20 70 61 67 65 20 70 50 67 20 66  st on page pPg f
ca10: 6f 72 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72  or space to stor
ca20: 65 20 61 20 63 65 6c 6c 20 6e 42 79 74 65 20 62  e a cell nByte b
ca30: 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e  ytes in.** size.
ca40: 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20 66   If one can be f
ca50: 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 61 20 70  ound, return a p
ca60: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 73 70  ointer to the sp
ca70: 61 63 65 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  ace and remove i
ca80: 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 72  t.** from the fr
ca90: 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  ee-list..**.** I
caa0: 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 73 70  f no suitable sp
cab0: 61 63 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ace can be found
cac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
cad0: 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  t, return NULL..
cae0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
caf0: 69 6f 6e 20 6d 61 79 20 64 65 74 65 63 74 20 63  ion may detect c
cb00: 6f 72 72 75 70 74 69 6f 6e 20 77 69 74 68 69 6e  orruption within
cb10: 20 70 50 67 2e 20 20 49 66 20 63 6f 72 72 75 70   pPg.  If corrup
cb20: 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63  tion is.** detec
cb30: 74 65 64 20 74 68 65 6e 20 2a 70 52 63 20 69 73  ted then *pRc is
cb40: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 43   set to SQLITE_C
cb50: 4f 52 52 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20  ORRUPT and NULL 
cb60: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
cb70: 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20  ** Slots on the 
cb80: 66 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 61  free list that a
cb90: 72 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64  re between 1 and
cba0: 20 33 20 62 79 74 65 73 20 6c 61 72 67 65 72 20   3 bytes larger 
cbb0: 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69  than nByte.** wi
cbc0: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 20 69 66  ll be ignored if
cbd0: 20 61 64 64 69 6e 67 20 74 68 65 20 65 78 74 72   adding the extr
cbe0: 61 20 73 70 61 63 65 20 74 6f 20 74 68 65 20 66  a space to the f
cbf0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75  ragmentation cou
cc00: 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20 74 68 65  nt.** causes the
cc10: 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63   fragmentation c
cc20: 6f 75 6e 74 20 74 6f 20 65 78 63 65 65 64 20 36  ount to exceed 6
cc30: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  0..*/.static u8 
cc40: 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65  *pageFindSlot(Me
cc50: 6d 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  mPage *pPg, int 
cc60: 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70 52 63 29  nByte, int *pRc)
cc70: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
cc80: 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
cc90: 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  et;.  u8 * const
cca0: 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
ccb0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 41 64 64 72  ata;.  int iAddr
ccc0: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e   = hdr + 1;.  in
ccd0: 74 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28  t pc = get2byte(
cce0: 26 61 44 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a  &aData[iAddr]);.
ccf0: 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75    int x;.  int u
cd00: 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d  sableSize = pPg-
cd10: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
cd20: 3b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  ;.  int size;   
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
cd40: 20 6f 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f   of the free slo
cd50: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
cd60: 70 63 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  pc>0 );.  while(
cd70: 20 70 63 3c 3d 75 73 61 62 6c 65 53 69 7a 65 2d   pc<=usableSize-
cd80: 34 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  4 ){.    /* EVID
cd90: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
cda0: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
cdb0: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
cdc0: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
cdd0: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
cde0: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
cdf0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
ce00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
ce10: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
ce20: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
ce30: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
ce40: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
ce50: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
ce60: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
ce70: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
ce80: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
ce90: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
cea0: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
ceb0: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
cec0: 20 20 20 69 66 28 20 73 69 7a 65 2b 70 63 20 3e     if( size+pc >
ced0: 20 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20   usableSize ){. 
cee0: 20 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51         *pRc = SQ
cef0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
cf00: 45 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  E(pPg);.        
cf10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
cf20: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
cf30: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
cf40: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
cf50: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
cf60: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
cf70: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
cf80: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
cf90: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
cfa0: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
cfb0: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
cfc0: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
cfd0: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
cfe0: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
cff0: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
d000: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
d010: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
d020: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
d030: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
d040: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
d050: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
d060: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
d070: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
d080: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
d090: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
d0a0: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
d0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
d0c0: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
d0d0: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
d0e0: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
d0f0: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
d100: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
d110: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
d120: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
d130: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
d140: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
d150: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
d160: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
d170: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
d180: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
d190: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
d1a0: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
d1b0: 63 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 63 3c  c]);.    if( pc<
d1c0: 69 41 64 64 72 2b 73 69 7a 65 20 29 20 62 72 65  iAddr+size ) bre
d1d0: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 63  ak;.  }.  if( pc
d1e0: 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20 53   ){.    *pRc = S
d1f0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
d200: 47 45 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20  GE(pPg);.  }..  
d210: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
d220: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74  ** Allocate nByt
d230: 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  e bytes of space
d240: 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74 68 65   from within the
d250: 20 42 2d 54 72 65 65 20 70 61 67 65 20 70 61 73   B-Tree page pas
d260: 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
d270: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 57 72  rst argument. Wr
d280: 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78 20 74  ite into *pIdx t
d290: 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50  he index into pP
d2a0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20  age->aData[].** 
d2b0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79 74  of the first byt
d2c0: 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 73  e of allocated s
d2d0: 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65 69 74  pace. Return eit
d2e0: 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72  her SQLITE_OK or
d2f0: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  .** an error cod
d300: 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c 49 54  e (usually SQLIT
d310: 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
d320: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61  * The caller gua
d330: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
d340: 72 65 20 69 73 20 73 75 66 66 69 63 69 65 6e 74  re is sufficient
d350: 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65 20 74   space to make t
d360: 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  he.** allocation
d370: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
d380: 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 65  might need to de
d390: 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72 64 65  fragment in orde
d3a0: 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20 61 6c  r to bring.** al
d3b0: 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f 67 65  l the space toge
d3c0: 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e 20 20  ther, however.  
d3d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
d3e0: 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a 2a 2a  l avoid using.**
d3f0: 20 74 68 65 20 66 69 72 73 74 20 74 77 6f 20 62   the first two b
d400: 79 74 65 73 20 70 61 73 74 20 74 68 65 20 63 65  ytes past the ce
d410: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll pointer area 
d420: 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62 6c 79  since presumably
d430: 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74   this.** allocat
d440: 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d 61 64  ion is being mad
d450: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  e in order to in
d460: 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c 6c 2c  sert a new cell,
d470: 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a 20 61   so we will.** a
d480: 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65 64 69  lso end up needi
d490: 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20 70 6f  ng a new cell po
d4a0: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
d4b0: 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53 70 61   int allocateSpa
d4c0: 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ce(MemPage *pPag
d4d0: 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e  e, int nByte, in
d4e0: 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f 6e 73  t *pIdx){.  cons
d4f0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 61 67  t int hdr = pPag
d500: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20  e->hdrOffset;   
d510: 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20   /* Local cache 
d520: 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  of pPage->hdrOff
d530: 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f  set */.  u8 * co
d540: 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61 67 65  nst data = pPage
d550: 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 2f 2a  ->aData;      /*
d560: 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
d570: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a  pPage->aData */.
d580: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
d590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
d5b0: 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  byte of cell con
d5c0: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
d5d0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
d5e0: 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
d5f0: 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
d600: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
d610: 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20 20 20  int gap;        
d620: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
d630: 20 67 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c   gap between cel
d640: 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 63  l pointers and c
d650: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  ell content */. 
d660: 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
d670: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
d680: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
d690: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
d6a0: 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20   pPage->pBt );. 
d6b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
d6c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
d6d0: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
d6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  ;.  assert( nByt
d6f0: 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69 6e 69  e>=0 );  /* Mini
d700: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
d710: 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20   4 */.  assert( 
d720: 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42  pPage->nFree>=nB
d730: 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  yte );.  assert(
d740: 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
d750: 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
d760: 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74 29 28  ( nByte < (int)(
d770: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d780: 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a 20 20  leSize-8) );..  
d790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
d7a0: 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68 64 72  ellOffset == hdr
d7b0: 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d   + 12 - 4*pPage-
d7c0: 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70 20 3d  >leaf );.  gap =
d7d0: 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
d7e0: 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
d7f0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 67  ell;.  assert( g
d800: 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 2f  ap<=65536 );.  /
d810: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
d820: 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49 66 20  -29356-02391 If 
d830: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 65  the database use
d840: 73 20 61 20 36 35 35 33 36 2d 62 79 74 65 20 70  s a 65536-byte p
d850: 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20 61 6e  age size.  ** an
d860: 64 20 74 68 65 20 72 65 73 65 72 76 65 64 20 73  d the reserved s
d870: 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28 74 68  pace is zero (th
d880: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 66 6f  e usual value fo
d890: 72 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  r reserved space
d8a0: 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20  ).  ** then the 
d8b0: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 66  cell content off
d8c0: 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74 79 20  set of an empty 
d8d0: 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20 62 65  page wants to be
d8e0: 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48 6f 77   65536..  ** How
d8f0: 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74 65 67  ever, that integ
d900: 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  er is too large 
d910: 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20  to be stored in 
d920: 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  a 2-byte unsigne
d930: 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72 2c 20  d.  ** integer, 
d940: 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20 30 20  so a value of 0 
d950: 69 73 20 75 73 65 64 20 69 6e 20 69 74 73 20 70  is used in its p
d960: 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d  lace. */.  top =
d970: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d980: 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73 65 72  hdr+5]);.  asser
d990: 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70 50 61  t( top<=(int)pPa
d9a0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d9b0: 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76 65 6e  ize ); /* Preven
d9c0: 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69 74 50  t by getAndInitP
d9d0: 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28 20 67  age() */.  if( g
d9e0: 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20 69 66  ap>top ){.    if
d9f0: 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50 61 67  ( top==0 && pPag
da00: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
da10: 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20 20 20  ze==65536 ){.   
da20: 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36 3b 0a     top = 65536;.
da30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
da50: 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
da60: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
da70: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
da80: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
da90: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
daa0: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
dab0: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
dac0: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
dad0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
dae0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
daf0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
db00: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
db10: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
db20: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
db30: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
db40: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
db50: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
db60: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
db70: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
db80: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
db90: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
dba0: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
dbb0: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
dbc0: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
dbd0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
dbe0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
dbf0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
dc00: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
dc10: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
dc20: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
dc30: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
dc40: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
dc50: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
dc60: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
dc70: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
dc80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
dc90: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
dca0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
dcb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
dcc0: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
dcd0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
dce0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
dcf0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
dd00: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
dd10: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
dd20: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
dd30: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
dd40: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
dd50: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
dd60: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
dd70: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
dd80: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
dd90: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
dda0: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
ddb0: 70 50 61 67 65 2c 20 4d 49 4e 28 34 2c 20 70 50  pPage, MIN(4, pP
ddc0: 61 67 65 2d 3e 6e 46 72 65 65 20 2d 20 28 32 2b  age->nFree - (2+
ddd0: 6e 42 79 74 65 29 29 29 3b 0a 20 20 20 20 69 66  nByte)));.    if
dde0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
ddf0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
de00: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
de10: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61  a[hdr+5]);.    a
de20: 73 73 65 72 74 28 20 67 61 70 2b 32 2b 6e 42 79  ssert( gap+2+nBy
de30: 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a  te<=top );.  }..
de40: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
de50: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
de60: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
de70: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
de80: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
de90: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
dea0: 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65 49  rea.  The btreeI
deb0: 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20 68  nitPage() call h
dec0: 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  as already.  ** 
ded0: 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66 72  validated the fr
dee0: 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20 74  eelist.  Given t
def0: 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73 74  hat the freelist
df00: 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72 65   is valid, there
df10: 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20  .  ** is no way 
df20: 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74  that the allocat
df30: 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20 6f  ion can extend o
df40: 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
df50: 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65  e page..  ** The
df60: 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77 20   assert() below 
df70: 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72 65  verifies the pre
df80: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a  vious sentence..
df90: 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42    */.  top -= nB
dfa0: 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65 28  yte;.  put2byte(
dfb0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f  &data[hdr+5], to
dfc0: 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 6f  p);.  assert( to
dfd0: 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74 29  p+nByte <= (int)
dfe0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
dff0: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64  leSize );.  *pId
e000: 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75 72  x = top;.  retur
e010: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e020: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
e030: 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50  ection of the pP
e040: 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68  age->aData to th
e050: 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54  e freelist..** T
e060: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
e070: 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c   the new free bl
e080: 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44  ock is pPage->aD
e090: 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61  ata[iStart].** a
e0a0: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
e0b0: 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a  he block is iSiz
e0c0: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  e bytes..**.** A
e0d0: 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f 63  djacent freebloc
e0e0: 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65 64  ks are coalesced
e0f0: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
e100: 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  t even though th
e110: 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74  e freeblock list
e120: 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79 20   was checked by 
e130: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 2c  btreeInitPage(),
e140: 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e 65  .** that routine
e150: 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74   will not detect
e160: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
e170: 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c   cells or freebl
e180: 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f  ocks.  Nor.** do
e190: 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65 6c  es it detect cel
e1a0: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
e1b0: 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20 69   that encrouch i
e1c0: 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65 64  nto the reserved
e1d0: 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68 65   bytes.** at the
e1e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65   end of the page
e1f0: 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69 6f  .  So do additio
e200: 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  nal corruption c
e210: 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68 69  hecks inside thi
e220: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64  s.** routine and
e230: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
e240: 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70 72  ORRUPT if any pr
e250: 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e 64  oblems are found
e260: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e270: 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61 67  freeSpace(MemPag
e280: 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69 53  e *pPage, u16 iS
e290: 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65 29  tart, u16 iSize)
e2a0: 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20 20  {.  u16 iPtr;   
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
e2d0: 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20 6e  ress of ptr to n
e2e0: 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f  ext freeblock */
e2f0: 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b 3b  .  u16 iFreeBlk;
e300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e310: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
e320: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
e330: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
e340: 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  8 hdr;          
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65 61       /* Page hea
e370: 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72 20  der size.  0 or 
e380: 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61  100 */.  u8 nFra
e390: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e3b0: 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20 66  * Reduction in f
e3c0: 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a  ragmentation */.
e3d0: 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65 20    u16 iOrigSize 
e3e0: 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20 20  = iSize;        
e3f0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
e400: 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53 69  nal value of iSi
e410: 7a 65 20 2a 2f 0a 20 20 75 31 36 20 78 3b 20 20  ze */.  u16 x;  
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e440: 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
e450: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
e460: 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69 53 74    u32 iEnd = iSt
e470: 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20 20 20  art + iSize;    
e480: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
e490: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 69   byte past the i
e4a0: 53 74 61 72 74 20 62 75 66 66 65 72 20 2a 2f 0a  Start buffer */.
e4b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
e4c0: 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61  *data = pPage->a
e4d0: 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67 65 20  Data;   /* Page 
e4e0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
e4f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
e500: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
e510: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
e520: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
e530: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e540: 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
e550: 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50 61 67   || iStart>=pPag
e560: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 70  e->hdrOffset+6+p
e570: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
e580: 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
e590: 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 45  CORRUPT_DB || iE
e5a0: 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74  nd <= pPage->pBt
e5b0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
e5c0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
e5d0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
e5e0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
e5f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 69  );.  assert( iSi
e600: 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69  ze>=4 );   /* Mi
e610: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
e620: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
e630: 28 20 69 53 74 61 72 74 3c 3d 70 50 61 67 65 2d  ( iStart<=pPage-
e640: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
e650: 2d 34 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  -4 );..  /* The 
e660: 6c 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63  list of freebloc
e670: 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73  ks must be in as
e680: 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20  cending order.  
e690: 46 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73  Find the .  ** s
e6a0: 70 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20  pot on the list 
e6b0: 77 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f  where iStart sho
e6c0: 75 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e  uld be inserted.
e6d0: 0a 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50  .  */.  hdr = pP
e6e0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
e6f0: 20 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31    iPtr = hdr + 1
e700: 3b 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74  ;.  if( data[iPt
e710: 72 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b  r+1]==0 && data[
e720: 69 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  iPtr]==0 ){.    
e730: 69 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f  iFreeBlk = 0;  /
e740: 2a 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74  * Shortcut for t
e750: 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65  he case when the
e760: 20 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70   freelist is emp
e770: 74 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  ty */.  }else{. 
e780: 20 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65     while( (iFree
e790: 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  Blk = get2byte(&
e7a0: 64 61 74 61 5b 69 50 74 72 5d 29 29 3c 69 53 74  data[iPtr]))<iSt
e7b0: 61 72 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28  art ){.      if(
e7c0: 20 69 46 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34   iFreeBlk<iPtr+4
e7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
e7e0: 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 20 62 72  iFreeBlk==0 ) br
e7f0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  eak;.        ret
e800: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
e810: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
e820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 50        }.      iP
e830: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
e840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
e850: 65 65 42 6c 6b 3e 70 50 61 67 65 2d 3e 70 42 74  eeBlk>pPage->pBt
e860: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29  ->usableSize-4 )
e870: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
e880: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
e890: 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  GE(pPage);.    }
e8a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72  .    assert( iFr
e8b0: 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46  eeBlk>iPtr || iF
e8c0: 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a  reeBlk==0 );.  .
e8d0: 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
e8e0: 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20  oint:.    **    
e8f0: 69 46 72 65 65 42 6c 6b 3a 20 20 20 46 69 72 73  iFreeBlk:   Firs
e900: 74 20 66 72 65 65 62 6c 6f 63 6b 20 61 66 74 65  t freeblock afte
e910: 72 20 69 53 74 61 72 74 2c 20 6f 72 20 7a 65 72  r iStart, or zer
e920: 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a  o if none.    **
e930: 20 20 20 20 69 50 74 72 3a 20 20 20 20 20 20 20      iPtr:       
e940: 54 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  The address of a
e950: 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 46 72 65   pointer to iFre
e960: 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eBlk.    **.    
e970: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
e980: 69 66 20 69 46 72 65 65 42 6c 6b 20 73 68 6f 75  if iFreeBlk shou
e990: 6c 64 20 62 65 20 63 6f 61 6c 65 73 63 65 64 20  ld be coalesced 
e9a0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
e9b0: 69 53 74 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20  iStart..    */. 
e9c0: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 20     if( iFreeBlk 
e9d0: 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65  && iEnd+3>=iFree
e9e0: 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 6e 46 72  Blk ){.      nFr
e9f0: 61 67 20 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20  ag = iFreeBlk - 
ea00: 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 66 28 20  iEnd;.      if( 
ea10: 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b 20 29 20  iEnd>iFreeBlk ) 
ea20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
ea30: 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65  RRUPT_PAGE(pPage
ea40: 29 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  );.      iEnd = 
ea50: 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32 62  iFreeBlk + get2b
ea60: 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65 42  yte(&data[iFreeB
ea70: 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66  lk+2]);.      if
ea80: 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d 3e  ( iEnd > pPage->
ea90: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
eaa0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
eab0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
eac0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
ead0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 69 7a      }.      iSiz
eae0: 65 20 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72  e = iEnd - iStar
eaf0: 74 3b 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c  t;.      iFreeBl
eb00: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
eb10: 74 61 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20  ta[iFreeBlk]);. 
eb20: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
eb30: 66 20 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65  f iPtr is anothe
eb40: 72 20 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61  r freeblock (tha
eb50: 74 20 69 73 2c 20 69 66 20 69 50 74 72 20 69 73  t is, if iPtr is
eb60: 20 6e 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73   not the freelis
eb70: 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72  t.    ** pointer
eb80: 20 69 6e 20 74 68 65 20 70 61 67 65 20 68 65 61   in the page hea
eb90: 64 65 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20  der) then check 
eba0: 74 6f 20 73 65 65 20 69 66 20 69 53 74 61 72 74  to see if iStart
ebb0: 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a   should be.    *
ebc0: 2a 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  * coalesced onto
ebd0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72   the end of iPtr
ebe0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ebf0: 20 69 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20   iPtr>hdr+1 ){. 
ec00: 20 20 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64       int iPtrEnd
ec10: 20 3d 20 69 50 74 72 20 2b 20 67 65 74 32 62 79   = iPtr + get2by
ec20: 74 65 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d  te(&data[iPtr+2]
ec30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 74  );.      if( iPt
ec40: 72 45 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29  rEnd+3>=iStart )
ec50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  {.        if( iP
ec60: 74 72 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72  trEnd>iStart ) r
ec70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
ec80: 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
ec90: 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61 67 20  ;.        nFrag 
eca0: 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50 74 72  += iStart - iPtr
ecb0: 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69 53 69  End;.        iSi
ecc0: 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50 74 72  ze = iEnd - iPtr
ecd0: 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
ece0: 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 7d   = iPtr;.      }
ecf0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
ed00: 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d  Frag>data[hdr+7]
ed10: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
ed20: 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
ed30: 61 67 65 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  age);.    data[h
ed40: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
ed50: 20 20 7d 0a 20 20 78 20 3d 20 67 65 74 32 62 79    }.  x = get2by
ed60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
ed70: 3b 0a 20 20 69 66 28 20 69 53 74 61 72 74 3c 3d  ;.  if( iStart<=
ed80: 78 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  x ){.    /* The 
ed90: 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 73  new freeblock is
eda0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
edb0: 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  g of the cell co
edc0: 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20 20 20  ntent area,.    
edd0: 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74 65 6e  ** so just exten
ede0: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
edf0: 6e 74 20 61 72 65 61 20 72 61 74 68 65 72 20 74  nt area rather t
ee00: 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f 74 68  han create anoth
ee10: 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65 6c 69  er.    ** freeli
ee20: 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20  st entry */.    
ee30: 69 66 28 20 69 53 74 61 72 74 3c 78 20 7c 7c 20  if( iStart<x || 
ee40: 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72 65  iPtr!=hdr+1 ) re
ee50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
ee60: 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
ee70: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
ee80: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
ee90: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
eea0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
eeb0: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
eec0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
eed0: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
eee0: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
eef0: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
ef00: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
ef10: 20 69 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20   iStart);.  }.  
ef20: 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
ef30: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 46  btsFlags & BTS_F
ef40: 41 53 54 5f 53 45 43 55 52 45 20 29 7b 0a 20 20  AST_SECURE ){.  
ef50: 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20 64    /* Overwrite d
ef60: 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
ef70: 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77 68  on with zeros wh
ef80: 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64 65  en the secure_de
ef90: 6c 65 74 65 0a 20 20 20 20 2a 2a 20 6f 70 74 69  lete.    ** opti
efa0: 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  on is enabled */
efb0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
efc0: 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69 53  a[iStart], 0, iS
efd0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 75 74 32  ize);.  }.  put2
efe0: 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61 72  byte(&data[iStar
eff0: 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a 20  t], iFreeBlk);. 
f000: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
f010: 69 53 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65  iStart+2], iSize
f020: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
f030: 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65 3b 0a  e += iOrigSize;.
f040: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f050: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  OK;.}../*.** Dec
f060: 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79  ode the flags by
f070: 74 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79  te (the first by
f080: 74 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  te of the header
f090: 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20  ) for a page.** 
f0a0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66  and initialize f
f0b0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d  ields of the Mem
f0c0: 50 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61  Page structure a
f0d0: 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a  ccordingly..**.*
f0e0: 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f  * Only the follo
f0f0: 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  wing combination
f100: 73 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e  s are supported.
f110: 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65    Anything diffe
f120: 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65  rent.** indicate
f130: 73 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  s a corrupt data
f140: 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a  base files:.**.*
f150: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
f160: 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20  RODATA.**       
f170: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c    PTF_ZERODATA |
f180: 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20   PTF_LEAF.**    
f190: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
f1a0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a  A | PTF_INTKEY.*
f1b0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45  *         PTF_LE
f1c0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
f1d0: 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a  KEY | PTF_LEAF.*
f1e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63  /.static int dec
f1f0: 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65  odeFlags(MemPage
f200: 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61   *pPage, int fla
f210: 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72  gByte){.  BtShar
f220: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20  ed *pBt;     /* 
f230: 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d  A copy of pPage-
f240: 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  >pBt */..  asser
f250: 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t( pPage->hdrOff
f260: 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e  set==(pPage->pgn
f270: 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20  o==1 ? 100 : 0) 
f280: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
f290: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f2a0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f2b0: 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c  x) );.  pPage->l
f2c0: 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61 67 42  eaf = (u8)(flagB
f2d0: 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65 72 74  yte>>3);  assert
f2e0: 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31 3c  ( PTF_LEAF == 1<
f2f0: 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74 65  <3 );.  flagByte
f300: 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a 20   &= ~PTF_LEAF;. 
f310: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
f320: 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67 65  Size = 4-4*pPage
f330: 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67 65 2d  ->leaf;.  pPage-
f340: 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63 65 6c  >xCellSize = cel
f350: 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42 74 20  lSizePtr;.  pBt 
f360: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
f370: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
f380: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
f390: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
f3a0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
f3b0: 20 52 2d 30 37 32 39 31 2d 33 35 33 32 38 20 41   R-07291-35328 A
f3c0: 20 76 61 6c 75 65 20 6f 66 20 35 20 28 30 78 30   value of 5 (0x0
f3d0: 35 29 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67  5) means the pag
f3e0: 65 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 69  e is an.    ** i
f3f0: 6e 74 65 72 69 6f 72 20 74 61 62 6c 65 20 62 2d  nterior table b-
f400: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
f410: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
f420: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
f430: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
f440: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f450: 32 36 39 30 30 2d 30 39 31 37 36 20 41 20 76 61  26900-09176 A va
f460: 6c 75 65 20 6f 66 20 31 33 20 28 30 78 30 64 29  lue of 13 (0x0d)
f470: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
f480: 69 73 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66  is a.    ** leaf
f490: 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61   table b-tree pa
f4a0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f4b0: 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41  t( (PTF_LEAFDATA
f4c0: 7c 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f  |PTF_INTKEY|PTF_
f4d0: 4c 45 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20  LEAF)==13 );.   
f4e0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
f4f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   1;.    if( pPag
f500: 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
f510: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
f520: 61 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50  af = 1;.      pP
f530: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
f540: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
f550: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
f560: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
f570: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
f580: 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53     pPage->xCellS
f590: 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ize = cellSizePt
f5a0: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
f5b0: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
f5c0: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
f5d0: 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64  CellPtrNoPayload
f5e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
f5f0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42  e->maxLocal = pB
f600: 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20  t->maxLeaf;.    
f610: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20  pPage->minLocal 
f620: 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a  = pBt->minLeaf;.
f630: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
f640: 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41  Byte==PTF_ZERODA
f650: 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  TA ){.    /* EVI
f660: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 33 31  DENCE-OF: R-4331
f670: 36 2d 33 37 33 30 38 20 41 20 76 61 6c 75 65 20  6-37308 A value 
f680: 6f 66 20 32 20 28 30 78 30 32 29 20 6d 65 61 6e  of 2 (0x02) mean
f690: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6e  s the page is an
f6a0: 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69 6f 72  .    ** interior
f6b0: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61   index b-tree pa
f6c0: 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ge. */.    asser
f6d0: 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41  t( (PTF_ZERODATA
f6e0: 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f 2a 20 45  )==2 );.    /* E
f6f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 39  VIDENCE-OF: R-59
f700: 36 31 35 2d 34 32 38 32 38 20 41 20 76 61 6c 75  615-42828 A valu
f710: 65 20 6f 66 20 31 30 20 28 30 78 30 61 29 20 6d  e of 10 (0x0a) m
f720: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
f730: 20 61 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 69   a.    ** leaf i
f740: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
f750: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
f760: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
f770: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
f780: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
f790: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
f7a0: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
f7b0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
f7c0: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
f7d0: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
f7e0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
f7f0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
f800: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
f810: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
f820: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
f830: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
f840: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
f850: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
f860: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
f870: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
f880: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
f890: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
f8a0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f8b0: 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20  _PAGE(pPage);.  
f8c0: 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31 62  }.  pPage->max1b
f8d0: 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42 74  ytePayload = pBt
f8e0: 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
f8f0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
f900: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
f910: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
f920: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
f930: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
f940: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  block..**.** Ret
f950: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
f960: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77 65   success.  If we
f970: 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70 61   see that the pa
f980: 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63  ge does.** not c
f990: 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f  ontain a well-fo
f9a0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70 61  rmed database pa
f9b0: 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  ge, then return 
f9c0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  .** SQLITE_CORRU
f9d0: 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61  PT.  Note that a
f9e0: 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54   return of SQLIT
f9f0: 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  E_OK does not.**
fa00: 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20   guarantee that 
fa10: 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c  the page is well
fa20: 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c  -formed.  It onl
fa30: 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20  y shows that.** 
fa40: 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74  we failed to det
fa50: 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69  ect any corrupti
fa60: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
fa70: 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28  t btreeInitPage(
fa80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
fa90: 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20 20  .  int pc;      
faa0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
fab0: 20 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20   of a freeblock 
fac0: 77 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44  within pPage->aD
fad0: 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 68 64  ata[] */.  u8 hd
fae0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
faf0: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
fb00: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
fb10: 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  der */.  u8 *dat
fb20: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
fb30: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
fb40: 44 61 74 61 20 2a 2f 0a 20 20 42 74 53 68 61 72  Data */.  BtShar
fb50: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
fb60: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
fb70: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
fb80: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
fb90: 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66      /* Amount of
fba0: 20 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e   usable space on
fbb0: 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20   each page */.  
fbc0: 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  u16 cellOffset; 
fbd0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72 6f     /* Offset fro
fbe0: 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65 20  m start of page 
fbf0: 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f  to first cell po
fc00: 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  inter */.  int n
fc10: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Free;         /*
fc20: 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 75 73 65   Number of unuse
fc30: 64 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 70  d bytes on the p
fc40: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  age */.  int top
fc50: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
fc60: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
fc70: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
fc80: 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  ea */.  int iCel
fc90: 6c 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69  lFirst;    /* Fi
fca0: 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65  rst allowable ce
fcb0: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
fcc0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20  offset */.  int 
fcd0: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f  iCellLast;     /
fce0: 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20  * Last possible 
fcf0: 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63  cell or freebloc
fd00: 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 61  k offset */..  a
fd10: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
fd20: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
fd30: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62  ( pPage->pBt->db
fd40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
fd50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
fd60: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
fd70: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
fd80: 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  rt( pPage->pgno=
fd90: 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67  =sqlite3PagerPag
fda0: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
fdb0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
fdc0: 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71  ert( pPage == sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
fde0: 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
fdf0: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
fe00: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20  pPage->aData == 
fe10: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
fe20: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
fe30: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
fe40: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d   pPage->isInit==
fe50: 30 20 29 3b 0a 0a 20 20 70 42 74 20 3d 20 70 50  0 );..  pBt = pP
fe60: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 68 64 72 20  age->pBt;.  hdr 
fe70: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
fe80: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
fe90: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 2f 2a 20  ge->aData;.  /* 
fea0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
feb0: 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f  8594-02890 The o
fec0: 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20  ne-byte flag at 
fed0: 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61 74  offset 0 indicat
fee0: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 62 2d 74  ing.  ** the b-t
fef0: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
ff00: 2f 0a 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c  /.  if( decodeFl
ff10: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ff20: 68 64 72 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  hdr]) ){.    ret
ff30: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ff40: 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
ff50: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42    }.  assert( pB
ff60: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
ff70: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
ff80: 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
ff90: 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
ffa0: 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
ffb0: 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
ffc0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
ffd0: 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
ffe0: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
fff0: 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  ;.  pPage->cellO
10000 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73  ffset = cellOffs
10010 65 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70  et = hdr + 8 + p
10020 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
10030 7a 65 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  ze;.  pPage->aDa
10040 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73  taEnd = &data[us
10050 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  ableSize];.  pPa
10060 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
10070 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
10080 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61  ;.  pPage->aData
10090 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
100a0 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
100b0 5d 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ];.  /* EVIDENCE
100c0 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31  -OF: R-58015-481
100d0 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20  75 The two-byte 
100e0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
100f0 74 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20  t 5 designates. 
10100 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f 66   ** the start of
10110 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
10120 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20 76  t area. A zero v
10130 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69 6e  alue for this in
10140 74 65 67 65 72 20 69 73 0a 20 20 2a 2a 20 69 6e  teger is.  ** in
10150 74 65 72 70 72 65 74 65 64 20 61 73 20 36 35 35  terpreted as 655
10160 33 36 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  36. */.  top = g
10170 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
10180 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
10190 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
101a0 52 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68  R-37002-32774 Th
101b0 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67  e two-byte integ
101c0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67  er at offset 3 g
101d0 69 76 65 73 20 74 68 65 0a 20 20 2a 2a 20 6e 75  ives the.  ** nu
101e0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e  mber of cells on
101f0 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
10200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
10210 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
10220 72 2b 33 5d 29 3b 0a 20 20 69 66 28 20 70 50 61  r+3]);.  if( pPa
10230 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
10240 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  L(pBt) ){.    /*
10250 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66   To many cells f
10260 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  or a single page
10270 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74  .  The page must
10280 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20   be corrupt */. 
10290 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
102a0 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50  _CORRUPT_PAGE(pP
102b0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74  age);.  }.  test
102c0 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65  case( pPage->nCe
102d0 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ll==MX_CELL(pBt)
102e0 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
102f0 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
10300 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
10310 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
10320 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
10330 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   ** possible for
10340 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20   a root page of 
10350 61 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f 6e  a table that con
10360 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29 20 74  tains no rows) t
10370 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 66 66  hen the.  ** off
10380 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
10390 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 77 69 6c  content area wil
103a0 6c 20 65 71 75 61 6c 20 74 68 65 20 70 61 67 65  l equal the page
103b0 20 73 69 7a 65 20 6d 69 6e 75 73 20 74 68 65 0a   size minus the.
103c0 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65    ** bytes of re
103d0 73 65 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f  served space. */
103e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
103f0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
10400 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
10410 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
10420 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20   /* A malformed 
10430 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69  database page mi
10440 67 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20  ght cause us to 
10450 72 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e  read past the en
10460 64 0a 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77  d.  ** of page w
10470 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
10480 6c 6c 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ll.  .  **.  ** 
10490 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
104a0 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
104b0 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
104c0 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
104d0 73 0a 20 20 2a 2a 20 70 61 73 74 20 74 68 65 20  s.  ** past the 
104e0 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20 62 6f  end of a page bo
104f0 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75 73 65  undary and cause
10500 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  s SQLITE_CORRUPT
10510 20 74 6f 20 62 65 20 0a 20 20 2a 2a 20 72 65 74   to be .  ** ret
10520 75 72 6e 65 64 20 69 66 20 69 74 20 64 6f 65 73  urned if it does
10530 2e 0a 20 20 2a 2f 0a 20 20 69 43 65 6c 6c 46 69  ..  */.  iCellFi
10540 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
10550 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
10560 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d  l;.  iCellLast =
10570 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b   usableSize - 4;
10580 0a 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e  .  if( pBt->db->
10590 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
105a0 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20  ellSizeCk ){.   
105b0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
105c0 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f     /* Index into
105d0 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
105e0 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  r array */.    i
105f0 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
10600 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
10610 6c 6c 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 21  ll */..    if( !
10620 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43  pPage->leaf ) iC
10630 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20 20 66  ellLast--;.    f
10640 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
10650 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
10660 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
10670 65 41 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63  eAligned(&data[c
10680 65 6c 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b  ellOffset+i*2]);
10690 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
106a0 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
106b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
106c0 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74  e( pc==iCellLast
106d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   );.      if( pc
106e0 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
106f0 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
10700 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
10710 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47  LITE_CORRUPT_PAG
10720 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  E(pPage);.      
10730 7d 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61  }.      sz = pPa
10740 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
10750 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
10760 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
10770 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
10780 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
10790 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65  pc+sz>usableSize
107a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
107b0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
107c0 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
107d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
107e0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
107f0 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
10800 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a 20 43 6f 6d  .  }  ..  /* Com
10810 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66  pute the total f
10820 72 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65  ree space on the
10830 20 70 61 67 65 0a 20 20 2a 2a 20 45 56 49 44 45   page.  ** EVIDE
10840 4e 43 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d  NCE-OF: R-23588-
10850 33 34 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79  34450 The two-by
10860 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
10870 66 73 65 74 20 31 20 67 69 76 65 73 20 74 68 65  fset 1 gives the
10880 0a 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74  .  ** start of t
10890 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
108a0 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
108b0 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
108c0 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 2a 2a 20  ere are no.  ** 
108d0 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20  freeblocks. */. 
108e0 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
108f0 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
10900 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72  nFree = data[hdr
10910 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49  +7] + top;  /* I
10920 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e  nit nFree to non
10930 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20  -freeblock free 
10940 73 70 61 63 65 20 2a 2f 0a 20 20 69 66 28 20 70  space */.  if( p
10950 63 3e 30 20 29 7b 0a 20 20 20 20 75 33 32 20 6e  c>0 ){.    u32 n
10960 65 78 74 2c 20 73 69 7a 65 3b 0a 20 20 20 20 69  ext, size;.    i
10970 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74  f( pc<iCellFirst
10980 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   ){.      /* EVI
10990 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33  DENCE-OF: R-5553
109a0 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c  0-52930 In a wel
109b0 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20  l-formed b-tree 
109c0 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c  page, there will
109d0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  .      ** always
109e0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
109f0 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
10a00 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
10a10 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
10a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10a30 4f 52 52 55 50 54 5f 50 41 47 45 28 70 50 61 67  ORRUPT_PAGE(pPag
10a40 65 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 77  e); .    }.    w
10a50 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20  hile( 1 ){.     
10a60 20 69 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73   if( pc>iCellLas
10a70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
10a80 46 72 65 65 62 6c 6f 63 6b 20 6f 66 66 20 74 68  Freeblock off th
10a90 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
10aa0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  e */.        ret
10ab0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
10ac0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
10ad0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
10ae0 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
10af0 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
10b00 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
10b10 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
10b20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72 65      nFree = nFre
10b30 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20 20  e + size;.      
10b40 69 66 28 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a  if( next<=pc+siz
10b50 65 2b 33 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  e+3 ) break;.   
10b60 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20     pc = next;.  
10b70 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 65 78 74    }.    if( next
10b80 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  >0 ){.      /* F
10b90 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
10ba0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
10bb0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
10bc0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
10bd0 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20  AGE(pPage);.    
10be0 7d 0a 20 20 20 20 69 66 28 20 70 63 2b 73 69 7a  }.    if( pc+siz
10bf0 65 3e 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  e>(unsigned int)
10c00 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
10c10 20 20 20 20 2f 2a 20 4c 61 73 74 20 66 72 65 65      /* Last free
10c20 62 6c 6f 63 6b 20 65 78 74 65 6e 64 73 20 70 61  block extends pa
10c30 73 74 20 70 61 67 65 20 65 6e 64 20 2a 2f 0a 20  st page end */. 
10c40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10c50 54 45 5f 43 4f 52 52 55 50 54 5f 50 41 47 45 28  TE_CORRUPT_PAGE(
10c60 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
10c70 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  }..  /* At this 
10c80 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63 6f 6e  point, nFree con
10c90 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20 6f 66  tains the sum of
10ca0 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
10cb0 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66  he start.  ** of
10cc0 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10cd0 74 20 61 72 65 61 20 70 6c 75 73 20 74 68 65 20  t area plus the 
10ce0 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20 62  number of free b
10cf0 79 74 65 73 20 77 69 74 68 69 6e 0a 20 20 2a 2a  ytes within.  **
10d00 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e   the cell-conten
10d10 74 20 61 72 65 61 2e 20 49 66 20 74 68 69 73 20  t area. If this 
10d20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
10d30 74 68 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a  the usable-size.
10d40 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
10d50 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
10d60 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
10d70 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
10d80 73 6f 0a 20 20 2a 2a 20 73 65 72 76 65 73 20 74  so.  ** serves t
10d90 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
10da0 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
10db0 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c  start of the cel
10dc0 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 61  l-content.  ** a
10dd0 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
10de0 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
10df0 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
10e00 68 65 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  he page..  */.  
10e10 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
10e20 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
10e30 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
10e40 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
10e50 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65   }.  pPage->nFre
10e60 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
10e70 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
10e80 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
10e90 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
10ea0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10eb0 20 53 65 74 20 75 70 20 61 20 72 61 77 20 70 61   Set up a raw pa
10ec0 67 65 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f  ge so that it lo
10ed0 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62  oks like a datab
10ee0 61 73 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67  ase page holding
10ef0 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a  .** no entries..
10f00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a  */.static void z
10f10 65 72 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20  eroPage(MemPage 
10f20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
10f30 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  s){.  unsigned c
10f40 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
10f50 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68  e->aData;.  BtSh
10f60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
10f70 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72  e->pBt;.  u8 hdr
10f80 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
10f90 73 65 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74  set;.  u16 first
10fa0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
10fb0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
10fc0 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
10fd0 67 65 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f  ge)==pPage->pgno
10fe0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10ff0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11000 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11010 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11020 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11030 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11040 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11050 67 65 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20  ge) == data );. 
11060 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
11070 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
11080 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11090 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
110a0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
110b0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
110c0 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c    if( pBt->btsFl
110d0 61 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53  ags & BTS_FAST_S
110e0 45 43 55 52 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ECURE ){.    mem
110f0 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
11100 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
11110 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
11120 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
11130 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
11140 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
11150 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
11160 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
11170 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
11180 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
11190 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
111a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
111b0 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
111c0 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
111d0 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
111e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
111f0 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
11200 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
11210 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
11220 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
11230 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
11240 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
11250 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
11260 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
11270 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
11280 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
11290 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
112a0 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
112b0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
112c0 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
112d0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
112e0 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
112f0 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
11300 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
11310 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
11320 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
11330 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
11340 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
11350 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
11360 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
11370 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
11380 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
11390 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
113a0 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
113b0 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
113c0 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
113d0 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
113e0 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
113f0 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
11400 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
11410 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
11420 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
11430 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
11440 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
11450 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
11460 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
11470 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
11480 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
11490 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
114a0 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
114b0 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
114c0 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
114d0 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
114e0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
114f0 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
11500 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
11510 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
11520 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
11530 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
11540 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
11550 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
11560 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
11570 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
11580 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
11590 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
115a0 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
115b0 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
115c0 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
115d0 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
115e0 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
115f0 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
11600 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
11610 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
11620 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
11630 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
11640 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
11650 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
11660 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
11670 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
11680 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
11690 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
116a0 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
116b0 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
116c0 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
116d0 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
116e0 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
116f0 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
11700 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
11710 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
11720 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
11730 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
11740 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
11750 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
11760 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
11770 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
11780 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
11790 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
117a0 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
117b0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
117c0 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
117d0 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
117e0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
117f0 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
11800 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11810 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
11820 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
11830 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
11840 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
11850 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
11860 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
11870 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
11880 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
11890 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
118a0 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
118b0 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
118c0 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
118d0 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
118e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
118f0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
11900 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11910 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
11920 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
11930 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
11940 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
11950 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
11960 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
11970 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
11980 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
11990 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
119a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
119b0 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
119c0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
119d0 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
119e0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
119f0 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
11a00 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
11a10 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
11a20 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
11a30 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
11a40 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
11a50 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
11a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
11a70 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
11a80 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
11a90 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
11aa0 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
11ab0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
11ac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11ad0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
11ae0 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
11af0 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
11b00 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
11b10 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
11b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
11b30 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
11b40 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
11b50 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
11b60 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
11b70 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
11b80 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
11b90 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
11ba0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
11bb0 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
11bc0 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
11bd0 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
11be0 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
11bf0 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
11c00 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
11c10 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
11c20 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
11c30 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
11c40 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
11c50 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
11c60 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
11c70 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
11c80 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
11c90 30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  00)==0 );.  retu
11ca0 72 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e  rn btreePagecoun
11cb0 74 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a  t(p->pBt);.}../*
11cc0 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
11cd0 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
11ce0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
11cf0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d  .**.** If pCur!=
11d00 30 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  0 then the page 
11d10 69 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64  is being fetched
11d20 20 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f   as part of a mo
11d30 76 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63  veToChild().** c
11d40 61 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f  all.  Do additio
11d50 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b  nal sanity check
11d60 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
11d70 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
11d80 20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63   And if the fetc
11d90 68 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f  h fails, this ro
11da0 75 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65  utine must decre
11db0 6d 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65  ment pCur->iPage
11dc0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ..**.** The page
11dd0 20 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72   is fetched as r
11de0 65 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73  ead-write unless
11df0 20 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c   pCur is not NUL
11e00 4c 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65  L and is.** a re
11e10 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a  ad-only cursor..
11e20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
11e30 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a  r occurs, then *
11e40 70 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69  ppPage is undefi
11e50 6e 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72  ned. It.** may r
11e60 65 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c  emain unchanged,
11e70 20 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65   or it may be se
11e80 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
11e90 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
11ea0 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50   int getAndInitP
11eb0 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11ec0 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
11ed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
11ee0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
11ef0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
11f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f10 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
11f20 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
11f30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
11f40 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
11f50 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11f60 70 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72  page pointer her
11f70 65 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  e */.  BtCursor 
11f80 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20  *pCur,          
11f90 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
11fa0 20 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20   to receive the 
11fb0 70 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  page, or NULL */
11fc0 0a 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79  .  int bReadOnly
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
11ff0 20 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20   read-only page 
12000 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
12010 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
12020 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
12030 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
12040 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
12050 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
12060 20 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75   || ppPage==&pCu
12070 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
12080 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
12090 20 62 52 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72   bReadOnly==pCur
120a0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
120b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
120c0 72 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50  r==0 || pCur->iP
120d0 61 67 65 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20  age>0 );..  if( 
120e0 70 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  pgno>btreePageco
120f0 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
12100 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
12110 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
12120 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
12130 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72  e_error;.  }.  r
12140 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12150 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
12160 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a   pgno, (DbPage**
12170 29 26 70 44 62 50 61 67 65 2c 20 62 52 65 61 64  )&pDbPage, bRead
12180 4f 6e 6c 79 29 3b 0a 20 20 69 66 28 20 72 63 20  Only);.  if( rc 
12190 29 7b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  ){.    goto getA
121a0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
121b0 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
121c0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69  = (MemPage*)sqli
121d0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
121e0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  (pDbPage);.  if(
121f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
12200 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 62 74 72  it==0 ){.    btr
12210 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65  eePageFromDbPage
12220 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20  (pDbPage, pgno, 
12230 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  pBt);.    rc = b
12240 74 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70  treeInitPage(*pp
12250 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
12260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12270 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
12280 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
12290 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69    goto getAndIni
122a0 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20  tPage_error;.   
122b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
122c0 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f   (*ppPage)->pgno
122d0 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ==pgno );.  asse
122e0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 61  rt( (*ppPage)->a
122f0 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61 67  Data==sqlite3Pag
12300 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
12310 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  e) );..  /* If o
12320 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
12330 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
12340 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
12350 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
12360 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
12370 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
12380 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
12390 20 70 43 75 72 20 26 26 20 28 28 2a 70 70 50 61   pCur && ((*ppPa
123a0 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20  ge)->nCell<1 || 
123b0 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65  (*ppPage)->intKe
123c0 79 21 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y!=pCur->curIntK
123d0 65 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ey) ){.    rc = 
123e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50  SQLITE_CORRUPT_P
123f0 47 4e 4f 28 70 67 6e 6f 29 3b 0a 20 20 20 20 72  GNO(pgno);.    r
12400 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
12410 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65  ge);.    goto ge
12420 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72  tAndInitPage_err
12430 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
12440 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74   SQLITE_OK;..get
12450 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
12460 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b  r:.  if( pCur ){
12470 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65  .    pCur->iPage
12480 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  --;.    pCur->pP
12490 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
124a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
124b0 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
124c0 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
124d0 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
124e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
124f0 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
12500 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
12510 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
12520 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
12530 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
12540 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
12550 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
12560 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 31 20  ge..**.** Page1 
12570 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  is a special cas
12580 65 20 61 6e 64 20 6d 75 73 74 20 62 65 20 72 65  e and must be re
12590 6c 65 61 73 65 64 20 75 73 69 6e 67 20 72 65 6c  leased using rel
125a0 65 61 73 65 50 61 67 65 4f 6e 65 28 29 2e 0a 2a  easePageOne()..*
125b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
125c0 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
125d0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
125e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  {.  assert( pPag
125f0 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  e->aData );.  as
12600 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
12610 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
12620 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20  age->pDbPage!=0 
12630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
12640 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
12650 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
12660 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67  ) == (void*)pPag
12670 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
12680 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
12690 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
126a0 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  e)==pPage->aData
126b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
126c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
126d0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
126e0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
126f0 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c  PagerUnrefNotNul
12700 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  l(pPage->pDbPage
12710 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
12720 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d   releasePage(Mem
12730 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
12740 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c 65  if( pPage ) rele
12750 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
12760 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20  Page);.}.static 
12770 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65  void releasePage
12780 4f 6e 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  One(MemPage *pPa
12790 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
127a0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
127b0 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74  ert( pPage->aDat
127c0 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a );.  assert( p
127d0 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61  Page->pBt );.  a
127e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 44  ssert( pPage->pD
127f0 62 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73  bPage!=0 );.  as
12800 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12810 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
12820 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
12830 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
12840 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
12850 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
12860 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
12870 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
12880 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
12890 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
128a0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
128b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
128c0 72 65 66 50 61 67 65 4f 6e 65 28 70 50 61 67 65  refPageOne(pPage
128d0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ->pDbPage);.}../
128e0 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
128f0 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
12900 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
12910 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
12920 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
12930 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
12940 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12950 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
12960 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
12970 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
12980 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
12990 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
129a0 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
129b0 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
129c0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
129d0 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
129e0 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
129f0 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
12a00 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
12a10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
12a20 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
12a30 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
12a40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
12a50 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
12a60 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
12a70 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
12a80 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
12a90 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
12aa0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
12ab0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
12ac0 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
12ad0 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
12ae0 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
12af0 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
12b00 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
12b10 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
12b20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
12b30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
12b40 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
12b50 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
12b60 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
12b70 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
12b80 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
12b90 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
12ba0 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
12bb0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
12bc0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
12bd0 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
12be0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
12bf0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
12c00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12c10 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
12c20 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
12c30 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
12c40 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
12c50 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
12c60 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
12c70 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
12c80 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
12c90 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
12ca0 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
12cb0 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
12cc0 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
12cd0 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
12ce0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
12cf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
12d00 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
12d10 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
12d20 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
12d30 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
12d40 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
12d50 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
12d60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12d70 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
12d80 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
12d90 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
12da0 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
12db0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
12dc0 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
12dd0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
12de0 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12df0 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
12e00 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
12e10 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
12e20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12e30 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
12e40 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
12e50 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
12e60 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
12e70 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
12e80 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
12e90 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
12ea0 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
12eb0 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
12ec0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
12ed0 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
12ee0 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
12ef0 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
12f00 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
12f10 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
12f20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
12f30 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
12f40 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
12f50 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
12f60 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
12f70 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
12f80 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
12f90 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
12fa0 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
12fb0 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
12fc0 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
12fd0 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
12fe0 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
12ff0 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
13000 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
13010 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
13020 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
13030 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
13040 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
13050 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
13060 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
13070 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
13080 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
13090 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
130a0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
130b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
130c0 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
130d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
130e0 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
130f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
13100 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
13110 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
13120 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
13130 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
13140 3e 62 75 73 79 48 61 6e 64 6c 65 72 2c 0a 20 20  >busyHandler,.  
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13170 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
13180 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 3b 0a  (pBt->pPager));.
13190 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
131a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
131b0 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
131c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
131d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
131e0 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
131f0 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
13200 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
13210 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
13220 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
13230 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
13240 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
13250 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
13260 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
13270 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
13280 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
13290 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
132a0 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
132b0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
132c0 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
132d0 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
132e0 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
132f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
13300 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
13310 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
13320 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
13330 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
13340 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
13350 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
13360 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
13370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
13380 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
13390 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
133a0 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
133b0 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
133c0 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
133d0 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
133e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
133f0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
13400 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
13410 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
13420 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
13430 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
13440 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
13450 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
13460 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
13470 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13480 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
13490 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
134a0 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
134b0 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
134c0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
134d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
134e0 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
134f0 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
13500 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
13510 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
13520 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
13530 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
13540 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
13550 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
13560 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
13570 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
13580 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
13590 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
135a0 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
135b0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
135c0 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
135d0 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
135e0 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
135f0 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
13600 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
13610 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
13620 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
13630 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
13640 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
13650 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
13660 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
13670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
13680 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
13690 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
136a0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
136b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
136c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
136d0 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
136e0 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
136f0 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
13720 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
13730 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
13740 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
13750 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
13760 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
13770 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
13780 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13790 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
137a0 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
137b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
137c0 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
137d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137e0 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
137f0 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
13800 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
13810 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
13820 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
13830 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
13840 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
13850 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
13860 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
13870 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
13880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
13890 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
138a0 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
138b0 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
138c0 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
138d0 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
138e0 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
138f0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
13900 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
13910 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
13920 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
13930 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13940 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
13950 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
13960 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
13970 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
13980 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
13990 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
139a0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139c0 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
139d0 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
139e0 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a00 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
13a10 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13a20 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
13a30 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
13a40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
13a50 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
13a60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
13a70 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
13a80 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
13a90 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
13aa0 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
13ab0 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
13ac0 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
13ad0 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
13ae0 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
13af0 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
13b00 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
13b10 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
13b20 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
13b30 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
13b40 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
13b50 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
13b60 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
13b70 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
13b80 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
13b90 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
13ba0 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
13bb0 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
13bc0 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
13bd0 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
13be0 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
13bf0 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
13c00 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13c10 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
13c20 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
13c30 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
13c40 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
13c50 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
13c60 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
13c70 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
13c80 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
13c90 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
13ca0 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
13cb0 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
13cc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13cd0 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
13ce0 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
13cf0 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
13d00 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
13d10 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13d20 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
13d30 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
13d40 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
13d50 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
13d60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13d70 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
13d80 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
13d90 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
13da0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
13db0 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
13dc0 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
13dd0 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
13de0 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
13df0 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
13e00 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
13e10 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
13e20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
13e30 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
13e40 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
13e50 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
13e60 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
13e70 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
13e80 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13e90 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
13ea0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
13eb0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
13ec0 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
13ed0 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
13ee0 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
13ef0 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
13f00 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
13f10 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
13f20 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
13f30 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
13f40 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
13f50 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
13f60 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
13f70 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
13f80 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
13f90 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
13fa0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
13fb0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
13fc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13fd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13fe0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13ff0 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
14000 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
14010 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
14020 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
14030 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
14040 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14050 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
14060 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
14070 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
140a0 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
140b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
140c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
140d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
140e0 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
140f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14100 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
14110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14130 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
14140 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
14150 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
14160 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14170 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14180 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
14190 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
141a0 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
141b0 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
141c0 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
141d0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
141e0 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
141f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14200 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
14210 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
14220 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
14230 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
14240 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
14250 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
14260 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
14270 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
14280 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
14290 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
142a0 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
142b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
142c0 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
142d0 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
142e0 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
142f0 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
14300 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
14310 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
14320 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
14330 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
14340 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
14350 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
14360 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
14370 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
14380 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
14390 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
143a0 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
143b0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
143c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
143d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
143e0 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
143f0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
14400 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
14410 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
14420 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
14430 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
14440 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
14450 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
14460 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14470 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
14480 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
14490 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
144a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
144b0 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
144c0 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
144d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
144e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
144f0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
14500 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14510 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
14520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
14530 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
14540 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
14550 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
14560 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
14570 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
14580 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
14590 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
145a0 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
145b0 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
145c0 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
145d0 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
145e0 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
145f0 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
14600 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
14610 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
14620 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
14630 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
14640 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
14650 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
14660 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
14670 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
14680 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
14690 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
146a0 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
146b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
146c0 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
146d0 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
146e0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
146f0 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
14700 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
14710 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
14720 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
14730 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
14740 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
14750 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
14760 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
14770 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
14780 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
14790 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
147a0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
147b0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
147c0 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
147d0 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
147e0 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
147f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
14800 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
14810 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
14820 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
14830 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
14840 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
14850 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
14860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
14870 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
14880 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14890 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
148a0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
148b0 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
148c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65         sizeof(Me
148f0 6d 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76  mPage), flags, v
14900 66 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69  fsFlags, pageRei
14910 6e 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63  nit);.    if( rc
14920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14930 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14940 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42  rSetMmapLimit(pB
14950 74 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73  t->pPager, db->s
14960 7a 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63  zMmap);.      rc
14970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
14980 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42  eadFileheader(pB
14990 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66  t->pPager,sizeof
149a0 28 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48  (zDbHeader),zDbH
149b0 65 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  eader);.    }.  
149c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
149d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
149e0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
149f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
14a00 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38  >openFlags = (u8
14a10 29 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d  )flags;.    pBt-
14a20 3e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71  >db = db;.    sq
14a30 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
14a40 79 48 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50  yHandler(pBt->pP
14a50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b  ager, btreeInvok
14a60 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42  eBusyHandler, pB
14a70 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d  t);.    p->pBt =
14a80 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74   pBt;.  .    pBt
14a90 2d 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20  ->pCursor = 0;. 
14aa0 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
14ab0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
14ac0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
14ad0 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  ly(pBt->pPager) 
14ae0 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ) pBt->btsFlags 
14af0 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59  |= BTS_READ_ONLY
14b00 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
14b10 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
14b20 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  TE).    pBt->bts
14b30 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
14b40 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6c 69  URE_DELETE;.#eli
14b50 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
14b60 5f 46 41 53 54 5f 53 45 43 55 52 45 5f 44 45 4c  _FAST_SECURE_DEL
14b70 45 54 45 29 0a 20 20 20 20 70 42 74 2d 3e 62 74  ETE).    pBt->bt
14b80 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 4f 56  sFlags |= BTS_OV
14b90 45 52 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a  ERWRITE;.#endif.
14ba0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
14bb0 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
14bc0 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
14bd0 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
14be0 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
14bf0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
14c00 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
14c10 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
14c20 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
14c30 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
14c40 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
14c50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14c60 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  */.    pBt->page
14c70 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64 65  Size = (zDbHeade
14c80 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44 62  r[16]<<8) | (zDb
14c90 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29 3b  Header[17]<<16);
14ca0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61  .    if( pBt->pa
14cb0 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42  geSize<512 || pB
14cc0 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  t->pageSize>SQLI
14cd0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
14ce0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70  .         || ((p
14cf0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26  Bt->pageSize-1)&
14d00 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d  pBt->pageSize)!=
14d10 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  0 ){.      pBt->
14d20 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23 69  pageSize = 0;.#i
14d30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14d40 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
14d50 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
14d60 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
14d70 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
14d80 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
14d90 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
14da0 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
14db0 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
14dc0 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
14dd0 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
14de0 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
14df0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
14e00 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
14e10 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
14e20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
14e30 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
14e40 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
14e50 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
14e60 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
14e70 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
14e80 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
14e90 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
14ea0 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
14eb0 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
14ec0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
14ed0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
14ee0 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
14ef0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
14f00 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
14f10 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
14f20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
14f30 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
14f40 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
14f50 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
14f60 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
14f70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
14f80 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
14f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14fa0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
14fb0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
14fc0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
14fd0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
14fe0 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e       ** determin
14ff0 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79  ed by the one-by
15000 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65  te unsigned inte
15010 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20  ger found at an 
15020 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20  offset of 20.   
15030 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64     ** into the d
15040 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65 61  atabase file hea
15050 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e 52  der. */.      nR
15060 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
15070 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
15080 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
15090 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45  TS_PAGESIZE_FIXE
150a0 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  D;.#ifndef SQLIT
150b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
150c0 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
150d0 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
150e0 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
150f0 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
15100 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
15110 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
15120 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
15130 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
15140 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 72  ndif.    }.    r
15150 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15160 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
15170 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
15180 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76  ageSize, nReserv
15190 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
151a0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
151b0 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e 75  _out;.    pBt->u
151c0 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
151d0 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73  >pageSize - nRes
151e0 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
151f0 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ( (pBt->pageSize
15200 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20   & 7)==0 );  /* 
15210 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
15220 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a   of pageSize */.
15230 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64     .#if !defined
15240 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
15250 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64  RED_CACHE) && !d
15260 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
15270 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f  IT_DISKIO).    /
15280 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74  * Add the new Bt
15290 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f  Shared object to
152a0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
152b0 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72   sharable BtShar
152c0 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eds..    */.    
152d0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
152e0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
152f0 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45  le ){.      MUTE
15300 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
15310 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61  _mutex *mutexSha
15320 72 65 64 3b 20 29 0a 20 20 20 20 20 20 4d 55 54  red; ).      MUT
15330 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74 65 78 53  EX_LOGIC( mutexS
15340 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
15350 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15360 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15370 53 54 45 52 29 3b 29 0a 20 20 20 20 20 20 69 66  STER);).      if
15380 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  ( SQLITE_THREADS
15390 41 46 45 20 26 26 20 73 71 6c 69 74 65 33 47 6c  AFE && sqlite3Gl
153a0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
153b0 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 20  Mutex ){.       
153c0 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73 71   pBt->mutex = sq
153d0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
153e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
153f0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
15400 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  pBt->mutex==0 ){
15410 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
15420 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
15430 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
15440 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
15450 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15460 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
15470 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
15480 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
15490 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47    pBt->pNext = G
154a0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
154b0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
154c0 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47  heList);.      G
154d0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
154e0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
154f0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20  heList) = pBt;. 
15500 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
15510 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68  ex_leave(mutexSh
15520 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  ared);.    }.#en
15530 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65  dif.  }..#if !de
15540 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
15550 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
15560 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15570 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
15580 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20    /* If the new 
15590 42 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61  Btree uses a sha
155a0 72 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c  rable pBtShared,
155b0 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e   then link the n
155c0 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e  ew.  ** Btree in
155d0 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
155e0 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65  ll sharable Btre
155f0 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  es for the same 
15600 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a  connection..  **
15610 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70   The list is kep
15620 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  t in ascending o
15630 72 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72  rder by pBt addr
15640 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
15650 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
15660 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
15670 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66  ree *pSib;.    f
15680 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
15690 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  b; i++){.      i
156a0 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61  f( (pSib = db->a
156b0 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26  Db[i].pBt)!=0 &&
156c0 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20   pSib->sharable 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
156e0 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b  ( pSib->pPrev ){
156f0 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50   pSib = pSib->pP
15700 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  rev; }.        i
15710 66 28 20 28 75 70 74 72 29 70 2d 3e 70 42 74 3c  f( (uptr)p->pBt<
15720 28 75 70 74 72 29 70 53 69 62 2d 3e 70 42 74 20  (uptr)pSib->pBt 
15730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
15740 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20  pNext = pSib;.  
15750 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76          p->pPrev
15760 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
15770 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b  pSib->pPrev = p;
15780 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15790 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
157a0 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20   pSib->pNext && 
157b0 28 75 70 74 72 29 70 53 69 62 2d 3e 70 4e 65 78  (uptr)pSib->pNex
157c0 74 2d 3e 70 42 74 3c 28 75 70 74 72 29 70 2d 3e  t->pBt<(uptr)p->
157d0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
157e0 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
157f0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
15800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
15810 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
15820 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
15830 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
15840 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
15850 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
15860 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
15870 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
15880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15890 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
158a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
158b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
158c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
158d0 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
158e0 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
158f0 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
15900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15910 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
15920 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
15930 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
15940 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30  e(pBt->pPager, 0
15950 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15960 69 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a  ite3_free(pBt);.
15970 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15980 28 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65  (p);.    *ppBtre
15990 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
159a0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
159b0 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a   *pFile;..    /*
159c0 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
159d0 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
159e0 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
159f0 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
15a00 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   to the.    ** d
15a10 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78  efault value. Ex
15a20 63 65 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69  cept, when openi
15a30 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e  ng on an existin
15a40 67 20 73 68 61 72 65 64 20 70 61 67 65 72 2d 63  g shared pager-c
15a50 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20  ache,.    ** do 
15a60 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70  not change the p
15a70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e  ager-cache size.
15a80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
15a90 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
15aa0 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29  ma(p, 0, 0)==0 )
15ab0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
15ac0 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15ad0 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
15ae0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15af0 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20  CACHE_SIZE);.   
15b00 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65 20 3d 20   }..    pFile = 
15b10 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
15b20 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15b30 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d     if( pFile->pM
15b40 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
15b50 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e  sqlite3OsFileCon
15b60 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c 65 2c 20  trolHint(pFile, 
15b70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 44 42  SQLITE_FCNTL_PDB
15b80 2c 20 28 76 6f 69 64 2a 29 26 70 42 74 2d 3e 64  , (void*)&pBt->d
15b90 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
15ba0 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b  if( mutexOpen ){
15bb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
15bc0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15bd0 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20  mutexOpen) );.  
15be0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15bf0 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
15c00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
15c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
15c20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6e   sqlite3BtreeCon
15c30 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28 2a 70 70  nectionCount(*pp
15c40 42 74 72 65 65 29 3e 30 20 29 3b 0a 20 20 72 65  Btree)>0 );.  re
15c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15c60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
15c70 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
15c80 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
15c90 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
15ca0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
15cb0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
15cc0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
15cd0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
15ce0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
15cf0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
15d00 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
15d10 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
15d20 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
15d30 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
15d40 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
15d50 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
15d60 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
15d70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15d80 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15d90 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
15da0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
15db0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
15dc0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
15dd0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
15de0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
15df0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
15e00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
15e10 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
15e20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
15e30 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15e40 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15e50 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
15e60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15e70 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
15e80 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
15e90 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
15ea0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
15eb0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
15ec0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
15ed0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
15ee0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15ef0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15f00 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
15f10 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15f20 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
15f30 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
15f40 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
15f50 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
15f60 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
15f70 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
15f80 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
15f90 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
15fa0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
15fb0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
15fc0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
15fd0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
15fe0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
15ff0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16000 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
16010 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
16020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
16030 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
16040 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
16050 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
16060 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
16070 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
16080 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
16090 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
160a0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
160b0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
160c0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
160d0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
160e0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
160f0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
16100 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
16110 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
16120 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
16130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
16140 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
16150 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
16160 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
16170 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
16180 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
16190 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
161a0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
161b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
161c0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
161d0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
161e0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
161f0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
16200 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
16210 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
16220 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
16230 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
16240 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
16250 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
16260 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
16270 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
16280 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
16290 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
162a0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
162b0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
162c0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
162d0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
162e0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
162f0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
16300 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
16310 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
16320 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
16330 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
16340 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
16350 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
16360 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
16370 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
16380 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
16390 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
163a0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
163b0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
163c0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
163d0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
163e0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
163f0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
16400 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
16410 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
16420 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
16430 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
16440 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
16450 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
16460 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
16470 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
16480 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
16490 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
164a0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
164b0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
164c0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
164d0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
164e0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
164f0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
16500 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
16510 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
16520 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
16530 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
16540 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
16550 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
16560 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
16570 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
16580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
16590 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
165a0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
165b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
165c0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
165d0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
165e0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
165f0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
16600 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
16610 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
16620 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
16630 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
16640 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
16650 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
16660 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
16670 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
16680 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
16690 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
166a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
166b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
166c0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
166d0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
166e0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
166f0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
16700 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
16710 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16720 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
16730 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
16740 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16750 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
16760 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
16770 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
16780 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
16790 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
167a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
167b0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
167c0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
167d0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
167e0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
167f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
16800 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
16810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
16820 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
16830 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
16840 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
16850 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
16860 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
16870 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
16880 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
16890 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
168a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
168b0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
168c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
168d0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
168e0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
168f0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
16900 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
16910 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
16920 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
16930 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
16940 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
16950 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
16960 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
16970 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
16980 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16990 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
169a0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
169b0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
169c0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
169d0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
169e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
169f0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
16a00 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
16a10 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
16a20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
16a30 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
16a40 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
16a50 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
16a60 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
16a70 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
16a80 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
16a90 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
16aa0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
16ac0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
16ad0 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b 0a 20 20  ager, p->db);.  
16ae0 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
16af0 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
16b00 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
16b10 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
16b20 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
16b30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
16b40 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d 3e  3DbFree(0, pBt->
16b50 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72  pSchema);.    fr
16b60 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
16b70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
16b80 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69  ee(pBt);.  }..#i
16b90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16ba0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
16bb0 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
16bc0 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61  ToLock==0 );.  a
16bd0 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64  ssert( p->locked
16be0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
16bf0 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76  pPrev ) p->pPrev
16c00 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
16c10 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65  xt;.  if( p->pNe
16c20 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70  xt ) p->pNext->p
16c30 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b  Prev = p->pPrev;
16c40 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
16c50 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65  e3_free(p);.  re
16c60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16c70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16c80 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69 74  the "soft" limit
16c90 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   on the number o
16ca0 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63  f pages in the c
16cb0 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64 20  ache..** Unused 
16cc0 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20 70  and unmodified p
16cd0 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65 63  ages will be rec
16ce0 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20 6e  ycled when the n
16cf0 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
16d00 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 65  s in the cache e
16d10 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66 74  xceeds this soft
16d20 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68 65   limit.  But the
16d30 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
16d40 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65 64  cache is allowed
16d50 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72 20   to grow larger 
16d60 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74 20  than this limit 
16d70 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  if it contains.*
16d80 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f 72  * dirty pages or
16d90 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e 20   pages still in 
16da0 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a 69  active use..*/.i
16db0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
16dc0 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72 65  etCacheSize(Btre
16dd0 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
16de0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16df0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16e00 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16e10 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16e20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16e30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16e40 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
16e50 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 42  rSetCachesize(pB
16e60 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
16e70 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
16e80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16ea0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
16eb0 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d 69  the "spill" limi
16ec0 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
16ed0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16ee0 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68 65  cache..** If the
16ef0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
16f00 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c 69   exceeds this li
16f10 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72 69  mit during a wri
16f20 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  te transaction,.
16f30 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69 67  ** the pager mig
16f40 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22 73  ht attempt to "s
16f50 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20 74  pill" pages to t
16f60 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c 79  he journal early
16f70 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f 20   in.** order to 
16f80 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e 0a  free up memory..
16f90 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  **.** The value 
16fa0 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 20  returned is the 
16fb0 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
16fc0 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73 20  ze.  If zero is 
16fd0 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e 20  passed.** as an 
16fe0 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68 61  argument, no cha
16ff0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
17000 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65 20   the spill size 
17010 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75  setting, so.** u
17020 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20 30  sing mxPage of 0
17030 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75 65   is a way to que
17040 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ry the current s
17050 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e  pill size..*/.in
17060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
17070 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65 65  tSpillSize(Btree
17080 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17090 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
170a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
170b0 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74 28  t res;.  assert(
170c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
170d0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
170e0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
170f0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
17100 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  es = sqlite3Page
17110 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70 42  rSetSpillsize(pB
17120 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67  t->pPager, mxPag
17130 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  e);.  sqlite3Btr
17140 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
17150 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69 66  turn res;.}..#if
17160 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
17170 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68  _SIZE>0./*.** Ch
17180 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
17190 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
171a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
171b0 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a 2a  e that may be.**
171c0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e 0a   memory mapped..
171d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
171e0 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28  reeSetMmapLimit(
171f0 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74 65  Btree *p, sqlite
17200 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29 7b  3_int64 szMmap){
17210 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
17220 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
17230 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
17240 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
17250 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
17260 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
17270 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
17280 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d  etMmapLimit(pBt-
17290 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70 29  >pPager, szMmap)
172a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
172b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
172c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
172d0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
172e0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
172f0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
17300 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
17310 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
17320 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
17330 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
17340 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
17350 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
17360 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
17370 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
17380 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
17390 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
173a0 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
173b0 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
173c0 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
173d0 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
173e0 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
173f0 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
17400 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
17410 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
17420 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
17430 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
17440 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
17450 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
17460 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
17470 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
17480 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
17490 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
174a0 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
174b0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
174c0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
174d0 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
174e0 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61  BtreeSetPagerFla
174f0 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  gs(.  Btree *p, 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17510 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65 74  The btree to set
17520 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76 65   the safety leve
17530 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  l on */.  unsign
17540 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20 20  ed pgFlags      
17550 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47 45   /* Various PAGE
17560 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  R_* flags */.){.
17570 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17580 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
17590 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
175a0 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
175b0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
175c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
175d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
175e0 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67  tFlags(pBt->pPag
175f0 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20 20  er, pgFlags);.  
17600 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
17610 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
17620 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17630 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  if../*.** Change
17640 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61 67   the default pag
17650 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20  es size and the 
17660 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
17670 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61 67  ed bytes per pag
17680 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  e..** Or, if the
17690 20 70 61 67 65 20 73 69 7a 65 20 68 61 73 20 61   page size has a
176a0 6c 72 65 61 64 79 20 62 65 65 6e 20 66 69 78 65  lready been fixe
176b0 64 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  d, return SQLITE
176c0 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69  _READONLY .** wi
176d0 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61  thout changing a
176e0 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  nything..**.** T
176f0 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
17700 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
17710 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
17720 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
17730 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
17740 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
17750 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
17760 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
17770 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
17780 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
17790 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
177a0 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
177b0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
177c0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
177d0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
177e0 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
177f0 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
17800 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
17810 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
17820 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
17830 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
17840 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
17850 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
17860 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
17870 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
17880 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
17890 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
178a0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
178b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
178c0 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
178d0 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
178e0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a   unchanged..**.*
178f0 2a 20 49 66 20 74 68 65 20 69 46 69 78 21 3d 30  * If the iFix!=0
17900 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41   then the BTS_PA
17910 47 45 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61  GESIZE_FIXED fla
17920 67 20 69 73 20 73 65 74 20 73 6f 20 74 68 61 74  g is set so that
17930 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a   the page size.*
17940 2a 20 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d  * and autovacuum
17950 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e   mode can no lon
17960 67 65 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  ger be changed..
17970 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
17980 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 42  reeSetPageSize(B
17990 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67  tree *p, int pag
179a0 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
179b0 72 76 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a  rve, int iFix){.
179c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
179d0 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64  E_OK;.  BtShared
179e0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
179f0 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
17a00 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72  ve>=-1 && nReser
17a10 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c  ve<=255 );.  sql
17a20 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17a30 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41  );.#if SQLITE_HA
17a40 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52  S_CODEC.  if( nR
17a50 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69  eserve>pBt->opti
17a60 6d 61 6c 52 65 73 65 72 76 65 20 29 20 70 42 74  malReserve ) pBt
17a70 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
17a80 20 3d 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b   = (u8)nReserve;
17a90 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42  .#endif.  if( pB
17aa0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17ab0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
17ac0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
17ad0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17ae0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17af0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  READONLY;.  }.  
17b00 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29  if( nReserve<0 )
17b10 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d  {.    nReserve =
17b20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
17b30 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
17b40 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17b50 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e  nReserve>=0 && n
17b60 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a  Reserve<=255 );.
17b70 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d    if( pageSize>=
17b80 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
17b90 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
17ba0 5f 53 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20  _SIZE &&.       
17bb0 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70   ((pageSize-1)&p
17bc0 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20  ageSize)==0 ){. 
17bd0 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65     assert( (page
17be0 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a  Size & 7)==0 );.
17bf0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
17c00 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
17c10 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
17c20 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a   (u32)pageSize;.
17c30 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
17c40 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63  e(pBt);.  }.  rc
17c50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17c60 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
17c70 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
17c80 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65  geSize, nReserve
17c90 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  );.  pBt->usable
17ca0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
17cb0 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73  Size - (u16)nRes
17cc0 65 72 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78  erve;.  if( iFix
17cd0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
17ce0 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
17cf0 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65  _FIXED;.  sqlite
17d00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
17d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17d20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
17d30 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
17d40 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
17d50 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17d60 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
17d70 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
17d80 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
17d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17da0 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
17db0 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lar to sqlite3Bt
17dc0 72 65 65 47 65 74 52 65 73 65 72 76 65 28 29 2c  reeGetReserve(),
17dd0 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
17de0 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63  ** may only be c
17df0 61 6c 6c 65 64 20 69 66 20 69 74 20 69 73 20 67  alled if it is g
17e00 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 74  uaranteed that t
17e10 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20  he b-tree mutex 
17e20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65  is already.** he
17e30 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ld..**.** This i
17e40 73 20 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20  s useful in one 
17e50 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20  special case in 
17e60 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 63  the backup API c
17e70 6f 64 65 20 77 68 65 72 65 20 69 74 20 69 73 0a  ode where it is.
17e80 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68  ** known that th
17e90 65 20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20  e shared b-tree 
17ea0 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62  mutex is held, b
17eb0 75 74 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ut the mutex on 
17ec0 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
17ed0 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
17ee0 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20  s *p is not. In 
17ef0 74 68 69 73 20 63 61 73 65 20 69 66 20 73 71 6c  this case if sql
17f00 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
17f10 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63  .** were to be c
17f20 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20  alled, it might 
17f30 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d  collide with som
17f40 65 20 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f  e other operatio
17f50 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  n on the.** data
17f60 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74  base handle that
17f70 20 6f 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e   owns *p, causin
17f80 67 20 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61  g undefined beha
17f90 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
17fa0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
17fb0 72 76 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65  rveNoMutex(Btree
17fc0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
17fd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17fe0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
17ff0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
18000 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
18010 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
18020 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74  sableSize;.  ret
18030 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
18040 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18050 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
18060 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
18070 66 20 65 76 65 72 79 20 70 61 67 65 20 74 68 61  f every page tha
18080 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75  t.** are intentu
18090 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64  ally left unused
180a0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 22  .  This is the "
180b0 72 65 73 65 72 76 65 64 22 20 73 70 61 63 65 20  reserved" space 
180c0 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74  that is.** somet
180d0 69 6d 65 73 20 75 73 65 64 20 62 79 20 65 78 74  imes used by ext
180e0 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49  ensions..**.** I
180f0 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54  f SQLITE_HAS_MUT
18100 45 58 20 69 73 20 64 65 66 69 6e 65 64 20 74 68  EX is defined th
18110 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65  en the number re
18120 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
18130 20 67 72 65 61 74 65 72 20 6f 66 20 74 68 65 20   greater of the 
18140 63 75 72 72 65 6e 74 20 72 65 73 65 72 76 65 64  current reserved
18150 20 73 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d   space and the m
18160 61 78 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64  aximum requested
18170 0a 2a 2a 20 72 65 73 65 72 76 65 20 73 70 61 63  .** reserve spac
18180 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
18190 33 42 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c  3BtreeGetOptimal
181a0 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
181b0 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
181c0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
181d0 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65  p);.  n = sqlite
181e0 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
181f0 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64  NoMutex(p);.#ifd
18200 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
18210 44 45 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70  DEC.  if( n<p->p
18220 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
18230 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d  ve ) n = p->pBt-
18240 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b  >optimalReserve;
18250 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
18260 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
18270 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
18280 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61  /*.** Set the ma
18290 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
182a0 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
182b0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
182c0 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61  itive..** No cha
182d0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66  nges are made if
182e0 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20   mxPage is 0 or 
182f0 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67  negative..** Reg
18300 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76  ardless of the v
18310 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20  alue of mxPage, 
18320 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d  return the maxim
18330 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
18340 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18350 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42  eeMaxPageCount(B
18360 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
18370 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  age){.  int n;. 
18380 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
18390 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
183a0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
183b0 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50  Count(p->pBt->pP
183c0 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20  ager, mxPage);. 
183d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
183e0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
183f0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  n;.}../*.** Chan
18400 67 65 20 74 68 65 20 76 61 6c 75 65 73 20 66 6f  ge the values fo
18410 72 20 74 68 65 20 42 54 53 5f 53 45 43 55 52 45  r the BTS_SECURE
18420 5f 44 45 4c 45 54 45 20 61 6e 64 20 42 54 53 5f  _DELETE and BTS_
18430 4f 56 45 52 57 52 49 54 45 20 66 6c 61 67 73 3a  OVERWRITE flags:
18440 0a 2a 2a 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  .**.**    newFla
18450 67 3d 3d 30 20 20 20 20 20 20 20 42 6f 74 68 20  g==0       Both 
18460 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
18470 45 20 61 6e 64 20 42 54 53 5f 4f 56 45 52 57 52  E and BTS_OVERWR
18480 49 54 45 20 61 72 65 20 63 6c 65 61 72 65 64 0a  ITE are cleared.
18490 2a 2a 20 20 20 20 6e 65 77 46 6c 61 67 3d 3d 31  **    newFlag==1
184a0 20 20 20 20 20 20 20 42 54 53 5f 53 45 43 55 52         BTS_SECUR
184b0 45 5f 44 45 4c 45 54 45 20 73 65 74 20 61 6e 64  E_DELETE set and
184c0 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69   BTS_OVERWRITE i
184d0 73 20 63 6c 65 61 72 65 64 0a 2a 2a 20 20 20 20  s cleared.**    
184e0 6e 65 77 46 6c 61 67 3d 3d 32 20 20 20 20 20 20  newFlag==2      
184f0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
18500 54 45 20 63 6c 65 61 72 65 64 20 61 6e 64 20 42  TE cleared and B
18510 54 53 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  TS_OVERWRITE is 
18520 73 65 74 0a 2a 2a 20 20 20 20 6e 65 77 46 6c 61  set.**    newFla
18530 67 3d 3d 28 2d 31 29 20 20 20 20 4e 6f 20 63 68  g==(-1)    No ch
18540 61 6e 67 65 73 0a 2a 2a 0a 2a 2a 20 54 68 69 73  anges.**.** This
18550 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73   routine acts as
18560 20 61 20 71 75 65 72 79 20 69 66 20 6e 65 77 46   a query if newF
18570 6c 61 67 20 69 73 20 6c 65 73 73 20 74 68 61 6e  lag is less than
18580 20 7a 65 72 6f 0a 2a 2a 0a 2a 2a 20 57 69 74 68   zero.**.** With
18590 20 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 73   BTS_OVERWRITE s
185a0 65 74 2c 20 64 65 6c 65 74 65 64 20 63 6f 6e 74  et, deleted cont
185b0 65 6e 74 20 69 73 20 6f 76 65 72 77 72 69 74 74  ent is overwritt
185c0 65 6e 20 62 79 20 7a 65 72 6f 73 2c 20 62 75 74  en by zeros, but
185d0 0a 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c 65 61  .** freelist lea
185e0 66 20 70 61 67 65 73 20 61 72 65 20 6e 6f 74 20  f pages are not 
185f0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20  written back to 
18600 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
18610 68 75 73 20 69 6e 2d 70 61 67 65 0a 2a 2a 20 64  hus in-page.** d
18620 65 6c 65 74 65 64 20 63 6f 6e 74 65 6e 74 20 69  eleted content i
18630 73 20 63 6c 65 61 72 65 64 2c 20 62 75 74 20 66  s cleared, but f
18640 72 65 65 6c 69 73 74 20 64 65 6c 65 74 65 64 20  reelist deleted 
18650 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 2e 0a  content is not..
18660 2a 2a 0a 2a 2a 20 57 69 74 68 20 42 54 53 5f 53  **.** With BTS_S
18670 45 43 55 52 45 5f 44 45 4c 45 54 45 2c 20 6f 70  ECURE_DELETE, op
18680 65 72 61 74 69 6f 6e 20 69 73 20 6c 69 6b 65 20  eration is like 
18690 42 54 53 5f 4f 56 45 52 57 52 49 54 45 20 77 69  BTS_OVERWRITE wi
186a0 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e 0a  th the addition.
186b0 2a 2a 20 74 68 61 74 20 66 72 65 65 6c 69 73 74  ** that freelist
186c0 20 6c 65 61 66 20 70 61 67 65 73 20 61 72 65 20   leaf pages are 
186d0 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
186e0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
186f0 69 6e 63 72 65 61 73 69 6e 67 0a 2a 2a 20 74 68  increasing.** th
18700 65 20 61 6d 6f 75 6e 74 20 6f 66 20 64 69 73 6b  e amount of disk
18710 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   I/O..*/.int sql
18720 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
18730 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70 2c 20  elete(Btree *p, 
18740 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20  int newFlag){.  
18750 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d  int b;.  if( p==
18760 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
18770 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
18780 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
18790 42 54 53 5f 4f 56 45 52 57 52 49 54 45 3d 3d 42  BTS_OVERWRITE==B
187a0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
187b0 2a 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *2 );.  assert( 
187c0 42 54 53 5f 46 41 53 54 5f 53 45 43 55 52 45 3d  BTS_FAST_SECURE=
187d0 3d 28 42 54 53 5f 4f 56 45 52 57 52 49 54 45 7c  =(BTS_OVERWRITE|
187e0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
187f0 45 29 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 46  E) );.  if( newF
18800 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d  lag>=0 ){.    p-
18810 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  >pBt->btsFlags &
18820 3d 20 7e 42 54 53 5f 46 41 53 54 5f 53 45 43 55  = ~BTS_FAST_SECU
18830 52 45 3b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e  RE;.    p->pBt->
18840 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
18850 53 45 43 55 52 45 5f 44 45 4c 45 54 45 2a 6e 65  SECURE_DELETE*ne
18860 77 46 6c 61 67 3b 0a 20 20 7d 0a 20 20 62 20 3d  wFlag;.  }.  b =
18870 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61   (p->pBt->btsFla
18880 67 73 20 26 20 42 54 53 5f 46 41 53 54 5f 53 45  gs & BTS_FAST_SE
18890 43 55 52 45 29 2f 42 54 53 5f 53 45 43 55 52 45  CURE)/BTS_SECURE
188a0 5f 44 45 4c 45 54 45 3b 0a 20 20 73 71 6c 69 74  _DELETE;.  sqlit
188b0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
188c0 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
188d0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
188e0 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
188f0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
18900 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
18910 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
18920 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
18930 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
18940 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
18950 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
18960 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
18970 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
18980 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
18990 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
189a0 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
189b0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
189c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
189d0 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
189e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
189f0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
18a00 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
18a10 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
18a20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
18a30 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
18a40 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
18a50 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
18a60 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
18a70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
18a80 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
18a90 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
18aa0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
18ab0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
18ac0 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
18ad0 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
18ae0 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
18af0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
18b00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
18b10 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
18b20 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
18b30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18b40 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
18b50 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
18b60 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
18b70 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
18b80 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
18b90 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
18ba0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18bb0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
18bc0 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
18bd0 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
18be0 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
18bf0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
18c00 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
18c10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
18c20 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
18c30 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
18c40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18c50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
18c60 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
18c70 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
18c80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
18c90 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
18ca0 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
18cb0 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
18cc0 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
18cd0 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
18ce0 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
18cf0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
18d00 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
18d10 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
18d20 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
18d30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
18d40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
18d50 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
18d60 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
18d70 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 73 61  s not set the sa
18d80 66 65 74 79 2d 6c 65 76 65 6c 20 66 6f 72 20 74  fety-level for t
18d90 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
18da0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 75 73 69 6e 67  nection.** using
18db0 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
18dc0 6e 6f 75 73 22 2c 20 61 6e 64 20 69 66 20 74 68  nous", and if th
18dd0 65 20 73 61 66 65 74 79 2d 6c 65 76 65 6c 20 69  e safety-level i
18de0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
18df0 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
18e00 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  e passed to this
18e10 20 66 75 6e 63 74 69 6f 6e 20 61 73 20 74 68 65   function as the
18e20 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
18e30 72 2c 0a 2a 2a 20 73 65 74 20 69 74 20 73 6f 2e  r,.** set it so.
18e40 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .*/.#if SQLITE_D
18e50 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f  EFAULT_SYNCHRONO
18e60 55 53 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55  US!=SQLITE_DEFAU
18e70 4c 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f  LT_WAL_SYNCHRONO
18e80 55 53 20 5c 0a 20 20 20 20 26 26 20 21 64 65 66  US \.    && !def
18e90 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
18ea0 5f 57 41 4c 29 0a 73 74 61 74 69 63 20 76 6f 69  _WAL).static voi
18eb0 64 20 73 65 74 44 65 66 61 75 6c 74 53 79 6e 63  d setDefaultSync
18ec0 46 6c 61 67 28 42 74 53 68 61 72 65 64 20 2a 70  Flag(BtShared *p
18ed0 42 74 2c 20 75 38 20 73 61 66 65 74 79 5f 6c 65  Bt, u8 safety_le
18ee0 76 65 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  vel){.  sqlite3 
18ef0 2a 64 62 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a  *db;.  Db *pDb;.
18f00 20 20 69 66 28 20 28 64 62 3d 70 42 74 2d 3e 64    if( (db=pBt->d
18f10 62 29 21 3d 30 20 26 26 20 28 70 44 62 3d 64 62  b)!=0 && (pDb=db
18f20 2d 3e 61 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  ->aDb)!=0 ){.   
18f30 20 77 68 69 6c 65 28 20 70 44 62 2d 3e 70 42 74   while( pDb->pBt
18f40 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70 42 74 2d  ==0 || pDb->pBt-
18f50 3e 70 42 74 21 3d 70 42 74 20 29 7b 20 70 44 62  >pBt!=pBt ){ pDb
18f60 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 70 44  ++; }.    if( pD
18f70 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 20 0a  b->bSyncSet==0 .
18f80 20 20 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66       && pDb->saf
18f90 65 74 79 5f 6c 65 76 65 6c 21 3d 73 61 66 65 74  ety_level!=safet
18fa0 79 5f 6c 65 76 65 6c 20 0a 20 20 20 20 20 26 26  y_level .     &&
18fb0 20 70 44 62 21 3d 26 64 62 2d 3e 61 44 62 5b 31   pDb!=&db->aDb[1
18fc0 5d 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ] .    ){.      
18fd0 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65  pDb->safety_leve
18fe0 6c 20 3d 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  l = safety_level
18ff0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
19000 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
19010 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
19020 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f      pDb->safety_
19030 6c 65 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61  level | (db->fla
19040 67 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53  gs & PAGER_FLAGS
19050 5f 4d 41 53 4b 29 29 3b 0a 20 20 20 20 7d 0a 20  _MASK));.    }. 
19060 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
19070 69 6e 65 20 73 65 74 44 65 66 61 75 6c 74 53 79  ine setDefaultSy
19080 6e 63 46 6c 61 67 28 70 42 74 2c 73 61 66 65 74  ncFlag(pBt,safet
19090 79 5f 6c 65 76 65 6c 29 0a 23 65 6e 64 69 66 0a  y_level).#endif.
190a0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
190b0 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
190c0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
190d0 65 28 42 74 53 68 61 72 65 64 2a 29 3b 0a 0a 0a  e(BtShared*);...
190e0 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65  /*.** Get a refe
190f0 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20  rence to pPage1 
19100 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19110 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c  file.  This will
19120 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65  .** also acquire
19130 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74   a readlock on t
19140 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  hat file..**.** 
19150 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
19160 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
19170 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  .  If the file i
19180 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d  s not a.** well-
19190 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
191a0 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54  file, then SQLIT
191b0 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74  E_CORRUPT is ret
191c0 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45  urned..** SQLITE
191d0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
191e0 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
191f0 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51  e is locked.  SQ
19200 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73  LITE_NOMEM.** is
19210 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20   returned if we 
19220 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  run out of memor
19230 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y. .*/.static in
19240 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68  t lockBtree(BtSh
19250 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e  ared *pBt){.  in
19260 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
19270 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
19280 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63 74 69  e from subfuncti
19290 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ons */.  MemPage
192a0 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20 2f 2a   *pPage1;     /*
192b0 20 50 61 67 65 20 31 20 6f 66 20 74 68 65 20 64   Page 1 of the d
192c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
192d0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
192e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
192f0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
19300 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
19310 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d 20 30  nt nPageFile = 0
19320 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
19330 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
19340 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
19350 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64 65 72   int nPageHeader
19360 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
19370 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
19380 64 61 74 61 62 61 73 65 20 61 63 63 6f 72 64 69  database accordi
19390 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20  ng to hdr */..  
193a0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
193b0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
193c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
193d0 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d  rt( pBt->pPage1=
193e0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
193f0 69 74 65 33 50 61 67 65 72 53 68 61 72 65 64 4c  ite3PagerSharedL
19400 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ock(pBt->pPager)
19410 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19420 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
19430 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 47  c;.  rc = btreeG
19440 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26  etPage(pBt, 1, &
19450 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66  pPage1, 0);.  if
19460 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19470 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
19480 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b  /* Do some check
19490 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75  ing to help insu
194a0 72 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f  re the file we o
194b0 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a  pened really is.
194c0 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74    ** a valid dat
194d0 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a  abase file. .  *
194e0 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67  /.  nPage = nPag
194f0 65 48 65 61 64 65 72 20 3d 20 67 65 74 34 62 79  eHeader = get4by
19500 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61 67 65  te(28+(u8*)pPage
19510 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73 71 6c  1->aData);.  sql
19520 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19530 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
19540 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20 20 69  &nPageFile);.  i
19550 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d  f( nPage==0 || m
19560 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29 70 50  emcmp(24+(u8*)pP
19570 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b  age1->aData, 92+
19580 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
19590 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20 20 20  ta,4)!=0 ){.    
195a0 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46 69 6c  nPage = nPageFil
195b0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 42  e;.  }.  if( (pB
195c0 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  t->db->flags & S
195d0 51 4c 49 54 45 5f 52 65 73 65 74 44 61 74 61 62  QLITE_ResetDatab
195e0 61 73 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e  ase)!=0 ){.    n
195f0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Page = 0;.  }.  
19600 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
19610 20 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b     u32 pageSize;
19620 0a 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53  .    u32 usableS
19630 69 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67  ize;.    u8 *pag
19640 65 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61  e1 = pPage1->aDa
19650 74 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ta;.    rc = SQL
19660 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20  ITE_NOTADB;.    
19670 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19680 52 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76  R-43737-39999 Ev
19690 65 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65  ery valid SQLite
196a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
196b0 65 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74  egins.    ** wit
196c0 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  h the following 
196d0 31 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78  16 bytes (in hex
196e0 29 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37  ): 53 51 4c 69 7
196f0 34 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32  4 65 20 66 6f 72
19700 20 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34   6d.    ** 61 74
19710 20 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20   20 33 00. */.  
19720 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67    if( memcmp(pag
19730 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72  e1, zMagicHeader
19740 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20  , 16)!=0 ){.    
19750 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
19760 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
19770 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
19780 4d 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20  MIT_WAL.    if( 
19790 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20  page1[18]>1 ){. 
197a0 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61       pBt->btsFla
197b0 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f  gs |= BTS_READ_O
197c0 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  NLY;.    }.    i
197d0 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29  f( page1[19]>1 )
197e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
197f0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
19800 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
19810 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20  if( page1[18]>2 
19820 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
19830 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
19840 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
19850 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19860 3e 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >2 ){.      goto
19870 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
19880 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
19890 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76  * If the write v
198a0 65 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f  ersion is set to
198b0 20 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73   2, this databas
198c0 65 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65  e should be acce
198d0 73 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57  ssed.    ** in W
198e0 41 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  AL mode. If the 
198f0 6c 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  log is not alrea
19900 64 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74  dy open, open it
19910 20 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20   now. Then .    
19920 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
19930 5f 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77  _OK and return w
19940 69 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e  ithout populatin
19950 67 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65  g BtShared.pPage
19960 31 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  1..    ** The ca
19970 6c 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69  ller detects thi
19980 73 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73  s and calls this
19990 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e   function again.
199a0 20 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20   This is.    ** 
199b0 72 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20  required as the 
199c0 76 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20  version of page 
199d0 31 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74  1 currently in t
199e0 68 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a  he page1 buffer.
199f0 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62      ** may not b
19a00 65 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72  e the latest ver
19a10 73 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79  sion - there may
19a20 20 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20   be a newer one 
19a30 69 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a  in the log.    *
19a40 2a 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  * file..    */. 
19a50 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
19a60 3d 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73  ==2 && (pBt->bts
19a70 46 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57  Flags & BTS_NO_W
19a80 41 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AL)==0 ){.      
19a90 69 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a  int isOpen = 0;.
19aa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
19ab0 65 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70  e3PagerOpenWal(p
19ac0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f  Bt->pPager, &isO
19ad0 70 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pen);.      if( 
19ae0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19af0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19b00 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
19b10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19b20 20 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74        setDefault
19b30 53 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51  SyncFlag(pBt, SQ
19b40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
19b50 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 29 3b  _SYNCHRONOUS+1);
19b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
19b70 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pen==0 ){.      
19b80 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
19b90 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ne(pPage1);.    
19ba0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
19bb0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
19bc0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
19bd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
19be0 44 42 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  DB;.    }else{. 
19bf0 20 20 20 20 20 73 65 74 44 65 66 61 75 6c 74 53       setDefaultS
19c00 79 6e 63 46 6c 61 67 28 70 42 74 2c 20 53 51 4c  yncFlag(pBt, SQL
19c10 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
19c20 48 52 4f 4e 4f 55 53 2b 31 29 3b 0a 20 20 20 20  HRONOUS+1);.    
19c30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
19c40 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19c50 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20  15465-20813 The 
19c60 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69  maximum and mini
19c70 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79  mum embedded pay
19c80 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63  load.    ** frac
19c90 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65  tions and the le
19ca0 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74  af payload fract
19cb0 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ion values must 
19cc0 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33  be 64, 32, and 3
19cd0 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  2..    **.    **
19ce0 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   The original de
19cf0 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65  sign allowed the
19d00 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61  se amounts to va
19d10 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20  ry, but as of.  
19d20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36    ** version 3.6
19d30 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74  .0, we require t
19d40 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e  hem to be fixed.
19d50 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19d60 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31  memcmp(&page1[21
19d70 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30  ], "\100\040\040
19d80 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",3)!=0 ){.     
19d90 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
19da0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
19db0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19dc0 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38  F: R-51873-39618
19dd0 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66   The page size f
19de0 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69  or a database fi
19df0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74  le is.    ** det
19e00 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32  ermined by the 2
19e10 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f  -byte integer lo
19e20 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73  cated at an offs
19e30 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66  et of 16 bytes f
19e40 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62  rom.    ** the b
19e50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
19e60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
19e70 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d  /.    pageSize =
19e80 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20   (page1[16]<<8) 
19e90 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36  | (page1[17]<<16
19ea0 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
19eb0 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32  CE-OF: R-25008-2
19ec0 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66  1688 The size of
19ed0 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77   a page is a pow
19ee0 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a  er of two.    **
19ef0 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64   between 512 and
19f00 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65   65536 inclusive
19f10 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70  . */.    if( ((p
19f20 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
19f30 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20  ize)!=0.     || 
19f40 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f  pageSize>SQLITE_
19f50 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
19f60 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c      || pageSize<
19f70 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20  =256 .    ){.   
19f80 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
19f90 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
19fa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61  .    assert( (pa
19fb0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
19fc0 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
19fd0 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31  E-OF: R-59310-51
19fe0 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65  205 The "reserve
19ff0 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e  d space" size in
1a000 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20   the 1-byte.    
1a010 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  ** integer at of
1a020 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e  fset 20 is the n
1a030 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1a040 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  f space at the e
1a050 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63  nd of.    ** eac
1a060 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76  h page to reserv
1a070 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73  e for extensions
1a080 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
1a090 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a0a0 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20  37497-42412 The 
1a0b0 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65  size of the rese
1a0c0 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20  rved region is. 
1a0d0 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
1a0e0 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65   by the one-byte
1a0f0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65   unsigned intege
1a100 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66  r found at an of
1a110 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a  fset of 20.    *
1a120 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
1a130 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
1a140 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69   */.    usableSi
1a150 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20  ze = pageSize - 
1a160 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69  page1[20];.    i
1a170 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65  f( (u32)pageSize
1a180 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
1a190 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
1a1a0 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
1a1b0 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
1a1c0 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
1a1d0 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
1a1e0 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
1a1f0 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
1a200 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
1a210 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1a220 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
1a230 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
1a240 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
1a250 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
1a260 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
1a270 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
1a280 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
1a290 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
1a2a0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
1a2b0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
1a2c0 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
1a2d0 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
1a2e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
1a2f0 65 61 73 65 50 61 67 65 4f 6e 65 28 70 50 61 67  easePageOne(pPag
1a300 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  e1);.      pBt->
1a310 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
1a320 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  bleSize;.      p
1a330 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
1a340 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66  ageSize;.      f
1a350 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
1a360 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
1a370 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
1a380 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
1a390 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  r, &pBt->pageSiz
1a3a0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3c0 20 20 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75        pageSize-u
1a3d0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
1a3e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a3f0 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
1a400 65 33 57 72 69 74 61 62 6c 65 53 63 68 65 6d 61  e3WritableSchema
1a410 28 70 42 74 2d 3e 64 62 29 3d 3d 30 20 26 26 20  (pBt->db)==0 && 
1a420 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20  nPage>nPageFile 
1a430 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1a440 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a450 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  T;.      goto pa
1a460 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
1a470 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
1a480 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33  IDENCE-OF: R-283
1a490 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72  12-64704 However
1a4a0 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a  , the usable siz
1a4b0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  e is not allowed
1a4c0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65   to.    ** be le
1a4d0 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20  ss than 480. In 
1a4e0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
1a4f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
1a500 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20   512, then the. 
1a510 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73     ** reserved s
1a520 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74  pace size cannot
1a530 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20   exceed 32. */. 
1a540 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
1a550 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67  e<480 ){.      g
1a560 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
1a570 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
1a580 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
1a590 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
1a5a0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
1a5b0 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
1a5c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a5d0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1a5e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1a5f0 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
1a600 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
1a610 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
1a620 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
1a630 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
1a640 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
1a650 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
1a660 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
1a670 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
1a680 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
1a690 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
1a6a0 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
1a6b0 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
1a6c0 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
1a6d0 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
1a6e0 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
1a6f0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
1a700 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
1a710 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
1a720 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
1a730 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
1a740 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
1a750 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
1a760 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
1a770 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
1a780 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
1a790 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
1a7a0 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
1a7b0 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
1a7c0 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
1a7d0 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
1a7e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
1a7f0 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
1a800 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
1a810 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74  f a 2-byte point
1a820 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69  er, a header whi
1a830 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73  ch is as much as
1a840 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c  .  ** 17 bytes l
1a850 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65  ong, 0 to N byte
1a860 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e  s of payload, an
1a870 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20  d an optional 4 
1a880 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20  byte overflow.  
1a890 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e  ** page pointer.
1a8a0 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78  .  */.  pBt->max
1a8b0 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70  Local = (u16)((p
1a8c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
1a8d0 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b  2)*64/255 - 23);
1a8e0 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c  .  pBt->minLocal
1a8f0 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75   = (u16)((pBt->u
1a900 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
1a910 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42  /255 - 23);.  pB
1a920 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31  t->maxLeaf = (u1
1a930 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  6)(pBt->usableSi
1a940 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d  ze - 35);.  pBt-
1a950 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29  >minLeaf = (u16)
1a960 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ((pBt->usableSiz
1a970 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
1a980 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d  3);.  if( pBt->m
1a990 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20  axLocal>127 ){. 
1a9a0 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65     pBt->max1byte
1a9b0 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20  Payload = 127;. 
1a9c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d   }else{.    pBt-
1a9d0 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
1a9e0 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c   = (u8)pBt->maxL
1a9f0 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ocal;.  }.  asse
1aa00 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  rt( pBt->maxLeaf
1aa10 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c   + 23 <= MX_CELL
1aa20 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20  _SIZE(pBt) );.  
1aa30 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50  pBt->pPage1 = pP
1aa40 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61  age1;.  pBt->nPa
1aa50 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65  ge = nPage;.  re
1aa60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1aa70 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c  .page1_init_fail
1aa80 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ed:.  releasePag
1aa90 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20  eOne(pPage1);.  
1aaa0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
1aab0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1aac0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1aad0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1aae0 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   number of curso
1aaf0 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20  rs open on pBt. 
1ab00 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a  This is for use.
1ab10 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65  ** in assert() e
1ab20 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69  xpressions, so i
1ab30 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c  t is only compil
1ab40 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  ed if NDEBUG is 
1ab50 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a  not.** defined..
1ab60 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65  **.** Only write
1ab70 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75   cursors are cou
1ab80 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69  nted if wrOnly i
1ab90 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e  s true.  If wrOn
1aba0 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74  ly is.** false t
1abb0 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  hen all cursors 
1abc0 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a  are counted..**.
1abd0 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
1abe0 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
1abf0 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73  ine, a cursor is
1ac00 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74   any cursor that
1ac10 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f  .** is capable o
1ac20 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  f reading or wri
1ac30 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
1ac40 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74  base.  Cursors t
1ac50 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e  hat.** have been
1ac60 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68   tripped into th
1ac70 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73  e CURSOR_FAULT s
1ac80 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75  tate are not cou
1ac90 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nted..*/.static 
1aca0 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75  int countValidCu
1acb0 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
1acc0 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29  pBt, int wrOnly)
1acd0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  {.  BtCursor *pC
1ace0 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b  ur;.  int r = 0;
1acf0 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d  .  for(pCur=pBt-
1ad00 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20  >pCursor; pCur; 
1ad10 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74  pCur=pCur->pNext
1ad20 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e  ){.    if( (wrOn
1ad30 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  ly==0 || (pCur->
1ad40 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
1ad50 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20  WriteFlag)!=0). 
1ad60 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74      && pCur->eSt
1ad70 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate!=CURSOR_FAUL
1ad80 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20  T ) r++; .  }.  
1ad90 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64  return r;.}.#end
1ada0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
1adb0 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
1adc0 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
1add0 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
1ade0 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
1adf0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
1ae00 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
1ae10 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
1ae20 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
1ae30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
1ae40 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
1ae50 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
1ae60 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
1ae70 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
1ae80 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
1ae90 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
1aea0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
1aeb0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e  a transaction in
1aec0 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20   progress, this 
1aed0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1aee0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
1aef0 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  id unlockBtreeIf
1af00 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20  Unused(BtShared 
1af10 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28  *pBt){.  assert(
1af20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1af30 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1af40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75  );.  assert( cou
1af50 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70  ntValidCursors(p
1af60 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d  Bt,0)==0 || pBt-
1af70 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54  >inTransaction>T
1af80 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69  RANS_NONE );.  i
1af90 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
1afa0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1afb0 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31  E && pBt->pPage1
1afc0 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  !=0 ){.    MemPa
1afd0 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1afe0 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73  ->pPage1;.    as
1aff0 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44  sert( pPage1->aD
1b000 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ata );.    asser
1b010 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  t( sqlite3PagerR
1b020 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
1b030 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70  ger)==1 );.    p
1b040 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
1b050 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4f      releasePageO
1b060 6e 65 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a  ne(pPage1);.  }.
1b070 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20  }../*.** If pBt 
1b080 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70  points to an emp
1b090 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e  ty file then con
1b0a0 76 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20  vert that empty 
1b0b0 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e  file.** into a n
1b0c0 65 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73  ew empty databas
1b0d0 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
1b0e0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
1b0f0 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   of.** the datab
1b100 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1b110 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
1b120 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1b130 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
1b140 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1b150 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
1b160 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1b170 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1b180 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
1b190 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20  f( pBt->nPage>0 
1b1a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1b1b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1b1c0 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  P1 = pBt->pPage1
1b1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21  ;.  assert( pP1!
1b1e0 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  =0 );.  data = p
1b1f0 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20  P1->aData;.  rc 
1b200 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1b210 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65  ite(pP1->pDbPage
1b220 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1b230 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70  turn rc;.  memcp
1b240 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65  y(data, zMagicHe
1b250 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61  ader, sizeof(zMa
1b260 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61  gicHeader));.  a
1b270 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d  ssert( sizeof(zM
1b280 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20  agicHeader)==16 
1b290 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20  );.  data[16] = 
1b2a0 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53  (u8)((pBt->pageS
1b2b0 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20  ize>>8)&0xff);. 
1b2c0 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29   data[17] = (u8)
1b2d0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ((pBt->pageSize>
1b2e0 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61  >16)&0xff);.  da
1b2f0 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61  ta[18] = 1;.  da
1b300 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73  ta[19] = 1;.  as
1b310 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
1b320 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65  eSize<=pBt->page
1b330 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61  Size && pBt->usa
1b340 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74  bleSize+255>=pBt
1b350 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64  ->pageSize);.  d
1b360 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70  ata[20] = (u8)(p
1b370 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
1b380 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
1b390 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34  .  data[21] = 64
1b3a0 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33  ;.  data[22] = 3
1b3b0 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20  2;.  data[23] = 
1b3c0 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  32;.  memset(&da
1b3d0 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32  ta[24], 0, 100-2
1b3e0 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70  4);.  zeroPage(p
1b3f0 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50  P1, PTF_INTKEY|P
1b400 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46  TF_LEAF|PTF_LEAF
1b410 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62  DATA );.  pBt->b
1b420 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
1b430 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
1b440 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b450 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1b460 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1b470 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  oVacuum==1 || pB
1b480 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30  t->autoVacuum==0
1b490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
1b4a0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31  t->incrVacuum==1
1b4b0 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63   || pBt->incrVac
1b4c0 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34  uum==0 );.  put4
1b4d0 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
1b4e0 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56  4*4], pBt->autoV
1b4f0 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79  acuum);.  put4by
1b500 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a  te(&data[36 + 7*
1b510 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  4], pBt->incrVac
1b520 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  uum);.#endif.  p
1b530 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20  Bt->nPage = 1;. 
1b540 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20   data[31] = 1;. 
1b550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b560 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  K;.}../*.** Init
1b570 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74  ialize the first
1b580 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
1b590 61 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61  abase file (crea
1b5a0 74 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a  ting a database.
1b5b0 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ** consisting of
1b5c0 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61   a single page a
1b5d0 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a  nd no schema obj
1b5e0 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51  ects). Return SQ
1b5f0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75  LITE_OK.** if su
1b600 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
1b610 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1b620 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
1b630 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b640 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b  NewDb(Btree *p){
1b650 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
1b660 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
1b670 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61  );.  p->pBt->nPa
1b680 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e  ge = 0;.  rc = n
1b690 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42  ewDatabase(p->pB
1b6a0 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  t);.  sqlite3Btr
1b6b0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1b6c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1b6d0 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
1b6e0 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
1b6f0 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
1b700 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1b710 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
1b720 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
1b730 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
1b740 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
1b750 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
1b760 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1b770 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
1b780 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
1b790 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1b7a0 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
1b7b0 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
1b7c0 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
1b7d0 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
1b7e0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1b7f0 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
1b800 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
1b810 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
1b820 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
1b830 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1b840 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
1b850 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
1b860 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
1b870 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
1b880 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
1b890 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
1b8a0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1b8b0 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
1b8c0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
1b8d0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
1b8e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
1b8f0 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
1b900 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
1b910 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
1b920 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
1b930 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
1b940 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
1b950 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
1b960 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
1b970 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
1b980 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
1b990 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
1b9a0 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
1b9b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
1b9c0 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
1b9d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
1b9e0 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
1b9f0 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
1ba00 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
1ba10 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
1ba20 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
1ba30 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
1ba40 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
1ba50 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
1ba60 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
1ba70 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
1ba80 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
1ba90 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
1baa0 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
1bab0 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
1bac0 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
1bad0 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
1bae0 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
1baf0 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
1bb00 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
1bb10 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1bb20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
1bb30 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
1bb40 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
1bb50 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
1bb60 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
1bb70 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
1bb80 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
1bb90 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
1bba0 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
1bbb0 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
1bbc0 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
1bbd0 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
1bbe0 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
1bbf0 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
1bc00 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
1bc10 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
1bc20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
1bc30 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
1bc40 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
1bc50 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
1bc60 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
1bc70 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
1bc80 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
1bc90 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
1bca0 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
1bcb0 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
1bcc0 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
1bcd0 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
1bce0 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
1bcf0 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
1bd00 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
1bd10 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
1bd20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
1bd30 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
1bd40 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
1bd50 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
1bd60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bd70 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
1bd80 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
1bd90 6c 61 67 2c 20 69 6e 74 20 2a 70 53 63 68 65 6d  lag, int *pSchem
1bda0 61 56 65 72 73 69 6f 6e 29 7b 0a 20 20 42 74 53  aVersion){.  BtS
1bdb0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1bdc0 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1bdd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
1bde0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1bdf0 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1be00 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1be10 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1be20 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1be30 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1be40 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1be50 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1be60 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1be70 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1be80 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1be90 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1bea0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1beb0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1bec0 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1bed0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1bee0 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1bef0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1bf00 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1bf10 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1bf20 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1bf30 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1bf40 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1bf50 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1bf60 20 69 66 28 20 28 70 2d 3e 64 62 2d 3e 66 6c 61   if( (p->db->fla
1bf70 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 73 65  gs & SQLITE_Rese
1bf80 74 44 61 74 61 62 61 73 65 29 20 0a 20 20 20 26  tDatabase) .   &
1bf90 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  & sqlite3PagerIs
1bfa0 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
1bfb0 61 67 65 72 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  ager)==0 .  ){. 
1bfc0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
1bfd0 20 26 3d 20 7e 42 54 53 5f 52 45 41 44 5f 4f 4e   &= ~BTS_READ_ON
1bfe0 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  LY;.  }..  /* Wr
1bff0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
1c000 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
1c010 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
1c020 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1c030 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1c040 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1c050 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
1c060 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1c070 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1c080 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1c090 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
1c0a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1c0b0 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20  ED_CACHE.  {.   
1c0c0 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
1c0d0 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20   = 0;.    /* If 
1c0e0 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
1c0f0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
1c100 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
1c110 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
1c120 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73      ** on this s
1c130 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1c140 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1c150 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1c160 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72  tion is.    ** r
1c170 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1c180 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1c190 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1c1a0 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1c1b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1c1c0 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20  ANS_WRITE).     
1c1d0 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
1c1e0 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
1c1f0 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1c200 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
1c210 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20  Writer->db;.    
1c220 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
1c230 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f  >1 ){.      BtLo
1c240 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20  ck *pIter;.     
1c250 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1c260 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1c270 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1c280 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1c290 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
1c2a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c  ){.          pBl
1c2b0 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1c2c0 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1c2d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1c2e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c2f0 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b  }.    if( pBlock
1c300 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1c310 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1c320 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1c330 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1c340 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
1c350 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67  EDCACHE;.      g
1c360 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1c370 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1c380 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
1c390 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
1c3a0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1c3b0 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
1c3c0 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
1c3d0 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
1c3e0 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
1c3f0 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
1c400 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
1c410 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
1c420 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
1c430 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
1c440 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
1c450 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1c460 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
1c470 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
1c480 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
1c490 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1c4a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
1c4b0 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1c4c0 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
1c4d0 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
1c4e0 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
1c4f0 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1c500 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1c510 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
1c520 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
1c530 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
1c540 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
1c550 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
1c560 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
1c570 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1c580 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1c590 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
1c5a0 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
1c5b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
1c5c0 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
1c5d0 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
1c5e0 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
1c5f0 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
1c600 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
1c610 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1c620 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1c630 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
1c640 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
1c650 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
1c660 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
1c670 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
1c680 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
1c690 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1c6a0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
1c6b0 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
1c6c0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
1c6d0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1c6e0 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
1c6f0 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
1c700 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1c710 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1c720 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1c730 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1c740 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
1c750 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c760 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
1c770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1c780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c790 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1c7a0 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
1c7b0 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1c7c0 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1c7d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1c7e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c7f0 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1c800 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  pBt);.        }e
1c810 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
1c820 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
1c830 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1c840 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1c850 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
1c860 2f 2a 20 69 66 20 74 68 65 72 65 20 77 61 73 20  /* if there was 
1c870 6e 6f 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  no transaction o
1c880 70 65 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20  pened when this 
1c890 66 75 6e 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  function was.   
1c8a0 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64         ** called
1c8b0 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
1c8c0 5f 53 4e 41 50 53 48 4f 54 20 69 73 20 72 65 74  _SNAPSHOT is ret
1c8d0 75 72 6e 65 64 2c 20 63 68 61 6e 67 65 20 74 68  urned, change th
1c8e0 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  e error.        
1c8f0 20 20 2a 2a 20 63 6f 64 65 20 74 6f 20 53 51 4c    ** code to SQL
1c900 49 54 45 5f 42 55 53 59 2e 20 2a 2f 0a 20 20 20  ITE_BUSY. */.   
1c910 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1c920 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1c930 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c940 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 21 3d  .  .    if( rc!=
1c950 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c960 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66     unlockBtreeIf
1c970 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20  Unused(pBt);.   
1c980 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 28 72 63   }.  }while( (rc
1c990 26 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xFF)==SQLITE_B
1c9a0 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
1c9b0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1c9c0 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
1c9d0 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
1c9e0 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
1c9f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
1ca00 52 65 73 65 74 4c 6f 63 6b 54 69 6d 65 6f 75 74  ResetLockTimeout
1ca10 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 0a  (pBt->pPager);..
1ca20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ca30 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1ca40 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ca50 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1ca60 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1ca70 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1ca80 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1ca90 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1caa0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1cab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1cac0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1cad0 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1cae0 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1caf0 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1cb00 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1cb10 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1cb20 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1cb30 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1cb40 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1cb50 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1cb60 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1cb70 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1cb80 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1cb90 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1cba0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1cbb0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1cbc0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1cbd0 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1cbe0 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1cbf0 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1cc00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1cc10 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1cc20 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1cc30 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1cc40 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1cc50 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1cc60 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1cc70 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1cc80 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1cc90 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1cca0 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1ccb0 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1ccc0 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1ccd0 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1cce0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1ccf0 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1cd00 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1cd10 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1cd20 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1cd30 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1cd40 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1cd50 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1cd60 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1cd70 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1cd80 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1cd90 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1cda0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1cdb0 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1cdc0 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1cdd0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1cde0 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1cdf0 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1ce00 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1ce10 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1ce20 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1ce30 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1ce40 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1ce50 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1ce60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1ce70 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1ce80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ce90 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1cea0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ceb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1cec0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ced0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1cee0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1cef0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1cf00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1cf10 20 20 7d 0a 20 20 7d 0a 0a 74 72 61 6e 73 5f 62    }.  }..trans_b
1cf20 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
1cf30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cf40 20 69 66 28 20 70 53 63 68 65 6d 61 56 65 72 73   if( pSchemaVers
1cf50 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  ion ){.      *pS
1cf60 63 68 65 6d 61 56 65 72 73 69 6f 6e 20 3d 20 67  chemaVersion = g
1cf70 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
1cf80 61 67 65 31 2d 3e 61 44 61 74 61 5b 34 30 5d 29  age1->aData[40])
1cf90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cfa0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1cfb0 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61 6b  /* This call mak
1cfc0 65 73 20 73 75 72 65 20 74 68 61 74 20 74 68 65  es sure that the
1cfd0 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 63   pager has the c
1cfe0 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
1cff0 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  .      ** open s
1d000 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1d010 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1d020 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1d030 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 20 20 2a  an 0 and.      *
1d040 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
1d050 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
1d060 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
1d070 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
1d080 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  re..      */.   
1d090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1d0a0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
1d0b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
1d0c0 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
1d0d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1d0e0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1d0f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
1d100 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
1d110 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1d120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1d130 55 54 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a  UTOVACUUM../*.**
1d140 20 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72   Set the pointer
1d150 2d 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72  -map entries for
1d160 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
1d170 20 70 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73   page pPage. Als
1d180 6f 2c 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63  o, if.** pPage c
1d190 6f 6e 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68  ontains cells th
1d1a0 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72  at point to over
1d1b0 66 6c 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20  flow pages, set 
1d1c0 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d  the pointer.** m
1d1d0 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74  ap entries for t
1d1e0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
1d1f0 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74  s as well..*/.st
1d200 61 74 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c  atic int setChil
1d210 64 50 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65  dPtrmaps(MemPage
1d220 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20   *pPage){.  int 
1d230 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d250 2a 20 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62  * Counter variab
1d260 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  le */.  int nCel
1d270 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1d280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d290 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
1d2a0 20 70 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20   page pPage */. 
1d2b0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
1d2e0 64 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  de */.  BtShared
1d2f0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
1d300 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20  Bt;.  Pgno pgno 
1d310 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a  = pPage->pgno;..
1d320 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1d330 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
1d340 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
1d350 29 3b 0a 20 20 72 63 20 3d 20 70 50 61 67 65 2d  );.  rc = pPage-
1d360 3e 69 73 49 6e 69 74 20 3f 20 53 51 4c 49 54 45  >isInit ? SQLITE
1d370 5f 4f 4b 20 3a 20 62 74 72 65 65 49 6e 69 74 50  _OK : btreeInitP
1d380 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1d390 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d3a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1d3b0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1d3c0 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
1d3d0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1d3e0 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
1d3f0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1d400 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d 61 70 50  i);..    ptrmapP
1d410 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
1d420 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20   pCell, &rc);.. 
1d430 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
1d440 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
1d450 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
1d460 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
1d470 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
1d480 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1d490 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1d4a0 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20  o, &rc);.    }. 
1d4b0 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
1d4c0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1d4d0 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
1d4e0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1d4f0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1d500 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1d510 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1d520 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1d530 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1d540 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1d550 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1d560 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1d570 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1d580 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1d590 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1d5a0 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1d5b0 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1d5c0 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1d5d0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1d5e0 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1d5f0 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1d600 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1d610 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1d620 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1d630 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1d640 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1d650 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d670 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1d680 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1d690 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1d6a0 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1d6b0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1d6c0 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1d6d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1d6e0 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1d6f0 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1d700 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1d710 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1d720 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1d730 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1d740 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1d750 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1d760 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1d770 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1d780 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1d790 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1d7a0 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1d7b0 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1d7c0 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1d7d0 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1d7e0 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1d7f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1d800 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1d810 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1d820 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1d830 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1d840 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1d850 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d860 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1d870 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1d880 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1d890 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1d8a0 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1d8b0 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1d8c0 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1d8d0 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1d8e0 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1d8f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1d900 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20  T_PAGE(pPage);. 
1d910 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
1d920 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
1d930 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
1d940 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
1d950 74 20 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74  t nCell;.    int
1d960 20 72 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   rc;..    rc = p
1d970 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3f 20 53  Page->isInit ? S
1d980 51 4c 49 54 45 5f 4f 4b 20 3a 20 62 74 72 65 65  QLITE_OK : btree
1d990 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1d9a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1d9b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1d9c0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1d9d0 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1d9e0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1d9f0 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1da00 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1da10 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1da20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1da30 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1da40 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1da50 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1da60 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1da70 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1da80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1da90 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e  fo.nLocal<info.n
1daa0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
1dab0 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 2b 69       if( pCell+i
1dac0 6e 66 6f 2e 6e 53 69 7a 65 20 3e 20 70 50 61 67  nfo.nSize > pPag
1dad0 65 2d 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e  e->aData+pPage->
1dae0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
1daf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1db00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1db10 52 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29  RUPT_PAGE(pPage)
1db20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1db30 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
1db40 6d 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c  m==get4byte(pCel
1db50 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 20  l+info.nSize-4) 
1db60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1db70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e  ut4byte(pCell+in
1db80 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29  fo.nSize-4, iTo)
1db90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
1dba0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
1dbb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dbc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dbd0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65  if( get4byte(pCe
1dbe0 6c 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ll)==iFrom ){.  
1dbf0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1dc00 28 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20  (pCell, iTo);.  
1dc10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dc20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1dc30 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
1dc40 28 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20  ( i==nCell ){.  
1dc50 20 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50      if( eType!=P
1dc60 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a  TRMAP_BTREE || .
1dc70 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79            get4by
1dc80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1dc90 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1dca0 74 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  t+8])!=iFrom ){.
1dcb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1dcc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 41  QLITE_CORRUPT_PA
1dcd0 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  GE(pPage);.     
1dce0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1dcf0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1dd00 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1dd10 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1dd20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1dd30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
1dd40 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
1dd50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
1dd60 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
1dd70 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
1dd80 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
1dd90 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
1dda0 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
1ddb0 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  valid..**.** The
1ddc0 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69   isCommit flag i
1ddd0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
1dde0 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
1ddf0 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a  o remember that.
1de00 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e  ** the journal n
1de10 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28  eeds to be sync(
1de20 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62  )ed before datab
1de30 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
1de40 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62  ->pgno .** can b
1de50 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68  e written to. Th
1de60 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1de70 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f  eady promised no
1de80 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  t to write to th
1de90 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73  at.** page..*/.s
1dea0 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
1deb0 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
1dec0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
1ded0 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
1dee0 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
1def0 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
1df00 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
1df10 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
1df20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1df30 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
1df40 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
1df50 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1df60 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
1df70 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
1df80 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
1df90 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1dfa0 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
1dfb0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
1dfc0 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
1dfd0 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
1dfe0 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74  /.  int isCommit
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e000 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61  isCommit flag pa
1e010 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50  ssed to sqlite3P
1e020 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a  agerMovepage */.
1e030 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
1e040 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  trPage;   /* The
1e050 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1e060 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
1e070 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
1e080 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62  no iDbPage = pDb
1e090 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61  Page->pgno;.  Pa
1e0a0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
1e0b0 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  t->pPager;.  int
1e0c0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e0d0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1e0e0 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65  ERFLOW2 || eType
1e0f0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
1e100 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79  W1 || .      eTy
1e110 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe==PTRMAP_BTREE
1e120 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1e130 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20  P_ROOTPAGE );.  
1e140 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e150 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1e160 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1e170 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74  rt( pDbPage->pBt
1e180 3d 3d 70 42 74 20 29 3b 0a 20 20 69 66 28 20 69  ==pBt );.  if( i
1e190 44 62 50 61 67 65 3c 33 20 29 20 72 65 74 75 72  DbPage<3 ) retur
1e1a0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e1b0 5f 42 4b 50 54 3b 0a 0a 20 20 2f 2a 20 4d 6f 76  _BKPT;..  /* Mov
1e1c0 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66  e page iDbPage f
1e1d0 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20  rom its current 
1e1e0 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65  location to page
1e1f0 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67   number iFreePag
1e200 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41  e */.  TRACE(("A
1e210 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e  UTOVACUUM: Movin
1e220 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67  g %d to free pag
1e230 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25  e %d (ptr page %
1e240 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a  d type %d)\n", .
1e250 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69        iDbPage, i
1e260 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61  FreePage, iPtrPa
1e270 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72  ge, eType));.  r
1e280 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1e290 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c  Movepage(pPager,
1e2a0 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67   pDbPage->pDbPag
1e2b0 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 73  e, iFreePage, is
1e2c0 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
1e2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e2e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e2f0 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70 67   }.  pDbPage->pg
1e300 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b 0a  no = iFreePage;.
1e310 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67 65  .  /* If pDbPage
1e320 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61 67   was a btree-pag
1e330 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 68  e, then it may h
1e340 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73 20  ave child pages 
1e350 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a  and/or cells.  *
1e360 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
1e370 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
1e380 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
1e390 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1e3a0 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65 73  these.  ** pages
1e3b0 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61 6e   need to be chan
1e3c0 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ged..  **.  ** I
1e3d0 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e 20  f pDbPage is an 
1e3e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74  overflow page, t
1e3f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34 20  hen the first 4 
1e400 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65 20  bytes may store 
1e410 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74  a.  ** pointer t
1e420 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  o a subsequent o
1e430 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66  verflow page. If
1e440 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
1e450 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  e, then.  ** the
1e460 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65 65   pointer map nee
1e470 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64  ds to be updated
1e480 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71 75   for the subsequ
1e490 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
1e4a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54  e..  */.  if( eT
1e4b0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1e4c0 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1e4d0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1e4e0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
1e4f0 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65 29  Ptrmaps(pDbPage)
1e500 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e520 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e530 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  }.  }else{.    P
1e540 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67  gno nextOvfl = g
1e550 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65 2d  et4byte(pDbPage-
1e560 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28  >aData);.    if(
1e570 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a   nextOvfl!=0 ){.
1e580 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
1e590 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50  pBt, nextOvfl, P
1e5a0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
1e5b0 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63 29   iFreePage, &rc)
1e5c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e5d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e5e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e5f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e600 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65 20  }..  /* Fix the 
1e610 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65 72  database pointer
1e620 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61 67   on page iPtrPag
1e630 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20 61  e that pointed a
1e640 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20 2a  t iDbPage so.  *
1e650 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  * that it points
1e660 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20 41   at iFreePage. A
1e670 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69 6e  lso fix the poin
1e680 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
1e690 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65 2e  r.  ** iPtrPage.
1e6a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70  .  */.  if( eTyp
1e6b0 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
1e6c0 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  GE ){.    rc = b
1e6d0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1e6e0 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
1e6f0 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1e700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1e720 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
1e730 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1e740 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
1e750 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
1e760 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e770 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
1e780 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
1e790 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1e7a0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
1e7b0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
1e7c0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
1e7d0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
1e7e0 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
1e7f0 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1e800 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1e810 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e820 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1e830 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
1e840 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63 29  , iPtrPage, &rc)
1e850 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1e860 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
1e870 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1e880 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 69  on required by i
1e890 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 2e  ncrVacuumStep().
1e8a0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61   */.static int a
1e8b0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1e8c0 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d  (BtShared *, Mem
1e8d0 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c  Page **, Pgno *,
1e8e0 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a   Pgno, u8);../*.
1e8f0 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69 6e  ** Perform a sin
1e900 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20 69  gle step of an i
1e910 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
1e920 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  m. If successful
1e930 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49  , return.** SQLI
1e940 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65 20  TE_OK. If there 
1e950 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f  is no work to do
1e960 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20   (and therefore 
1e970 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a 20  no point in .** 
1e980 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1e990 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
1e9a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1e9b0 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72 6f  . Or, if an erro
1e9c0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72 65  r .** occurs, re
1e9d0 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  turn some other 
1e9e0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
1e9f0 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 61  * More specifica
1ea00 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  lly, this functi
1ea10 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
1ea20 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 64  e-organize the d
1ea30 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20 74  atabase so .** t
1ea40 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
1ea50 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
1ea60 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 69  rrently in use i
1ea70 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20 75  s no longer in u
1ea80 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65  se..**.** Parame
1ea90 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65 20  ter nFin is the 
1eaa0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1eab0 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62 61  that this databa
1eac0 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  se would contain
1ead0 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66 75  .** were this fu
1eae0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75 6e  nction called un
1eaf0 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1eb00 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
1eb10 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69 74  * If the bCommit
1eb20 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
1eb30 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75 6e  n-zero, this fun
1eb40 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68  ction assumes th
1eb50 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  at the .** calle
1eb60 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
1eb70 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
1eb80 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72 65  ep() until it re
1eb90 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
1eba0 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f  E .** or an erro
1ebb0 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70 61  r. bCommit is pa
1ebc0 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61 6e  ssed true for an
1ebd0 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e 2d   auto-vacuum-on-
1ebe0 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72 61  commit .** opera
1ebf0 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20 66  tion, or false f
1ec00 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  or an incrementa
1ec10 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74 61  l vacuum..*/.sta
1ec20 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75  tic int incrVacu
1ec30 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20  umStep(BtShared 
1ec40 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c  *pBt, Pgno nFin,
1ec50 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20 69   Pgno iLastPg, i
1ec60 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 50  nt bCommit){.  P
1ec70 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20  gno nFreeList;  
1ec80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ec90 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c  er of pages stil
1eca0 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  l on the free-li
1ecb0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  st */.  int rc;.
1ecc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ecd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
1ece0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
1ecf0 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e 6e  ssert( iLastPg>n
1ed00 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21 50  Fin );..  if( !P
1ed10 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1ed20 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
1ed30 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
1ed40 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1ed50 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20  .    u8 eType;. 
1ed60 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65     Pgno iPtrPage
1ed70 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73 74  ;..    nFreeList
1ed80 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74   = get4byte(&pBt
1ed90 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
1eda0 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  36]);.    if( nF
1edb0 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reeList==0 ){.  
1edc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1edd0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20  E_DONE;.    }.. 
1ede0 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65     rc = ptrmapGe
1edf0 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  t(pBt, iLastPg, 
1ee00 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
1ee10 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1ee20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ee30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ee40 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70    }.    if( eTyp
1ee50 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1ee60 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  GE ){.      retu
1ee70 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1ee80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20  T_BKPT;.    }.. 
1ee90 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1eea0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
1eeb0 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d 6d  .      if( bComm
1eec0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  it==0 ){.       
1eed0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
1eee0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
1eef0 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
1ef00 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
1ef10 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
1ef20 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e 2d   bCommit is non-
1ef30 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63 61  zero. In that ca
1ef40 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69 73  se, the free-lis
1ef50 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  t will be.      
1ef60 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
1ef70 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68 69  o zero after thi
1ef80 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1ef90 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  ns, so it doesn'
1efa0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 61  t .        ** ma
1efb0 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c 6c  tter if it still
1efc0 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67   contains some g
1efd0 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e 0a  arbage entries..
1efe0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1eff0 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b     Pgno iFreePg;
1f000 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1f010 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1f020 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1f030 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1f040 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1f050 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41 4c  g, iLastPg, BTAL
1f060 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20 20  LOC_EXACT);.    
1f070 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f090 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f0a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f0b0 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67 3d  assert( iFreePg=
1f0c0 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20 20  =iLastPg );.    
1f0d0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f0e0 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
1f0f0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
1f100 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50       Pgno iFreeP
1f110 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  g;             /
1f120 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65 20  * Index of free 
1f130 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c 61  page to move pLa
1f140 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20 20  stPg to */.     
1f150 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74 50   MemPage *pLastP
1f160 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f 64  g;.      u8 eMod
1f170 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 3b  e = BTALLOC_ANY;
1f180 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61 6d     /* Mode param
1f190 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1f1a0 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1f1b0 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61 72        Pgno iNear
1f1c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f1d0 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d 65  /* nearby parame
1f1e0 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74 65  ter for allocate
1f1f0 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a 0a  BtreePage() */..
1f200 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65        rc = btree
1f210 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c 61  GetPage(pBt, iLa
1f220 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c 20  stPg, &pLastPg, 
1f230 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1f240 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f250 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1f260 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f270 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20 69   /* If bCommit i
1f280 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
1f290 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
1f2a0 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
1f2b0 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
1f2c0 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
1f2d0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
1f2e0 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
1f2f0 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
1f300 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
1f310 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
1f320 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 67   if bCommit is g
1f330 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
1f340 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
1f350 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
1f360 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
1f370 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
1f380 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
1f390 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
1f3a0 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
1f3b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1f3c0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1f3d0 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64 65  ){.        eMode
1f3e0 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a 20   = BTALLOC_LE;. 
1f3f0 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20 6e         iNear = n
1f400 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Fin;.      }.   
1f410 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20     do {.        
1f420 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
1f430 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
1f440 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1f450 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
1f460 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72 2c  &iFreePg, iNear,
1f470 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 20   eMode);.       
1f480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f490 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f4a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73  releasePage(pLas
1f4b0 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tPg);.          
1f4c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f4d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 6c     }.        rel
1f4e0 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1f4f0 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1f500 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72 65   bCommit && iFre
1f510 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20 20  ePg>nFin );.    
1f520 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50    assert( iFreeP
1f530 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  g<iLastPg );.   
1f540 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20 72     .      rc = r
1f550 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
1f560 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
1f570 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
1f580 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20 20  Pg, bCommit);.  
1f590 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f5a0 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
1f5b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f5c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
1f5d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f5e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
1f5f0 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20   bCommit==0 ){. 
1f600 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 4c     do {.      iL
1f610 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77 68  astPg--;.    }wh
1f620 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50 45  ile( iLastPg==PE
1f630 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f640 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f 49  pBt) || PTRMAP_I
1f650 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1f660 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  Pg) );.    pBt->
1f670 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31 3b  bDoTruncate = 1;
1f680 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  .    pBt->nPage 
1f690 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a 20  = iLastPg;.  }. 
1f6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f6b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
1f6c0 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20  database opened 
1f6d0 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72 67  by the first arg
1f6e0 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74 6f  ument is an auto
1f6f0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1f700 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73 20  .** nOrig pages 
1f710 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
1f720 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70 61  ng nFree free pa
1f730 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ges. Return the 
1f740 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69 7a  expected .** siz
1f750 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1f760 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c 6f  e in pages follo
1f770 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61 63  wing an auto-vac
1f780 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  uum operation..*
1f790 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66 69  /.static Pgno fi
1f7a0 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61 72  nalDbSize(BtShar
1f7b0 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 4f  ed *pBt, Pgno nO
1f7c0 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65 29  rig, Pgno nFree)
1f7d0 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b 20  {.  int nEntry; 
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f800 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65 20   entries on one 
1f810 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  ptrmap page */. 
1f820 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20 20   Pgno nPtrmap;  
1f830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f840 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 74   /* Number of Pt
1f850 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62 65  rMap pages to be
1f860 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e 6f   freed */.  Pgno
1f870 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 20   nFin;          
1f880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f890 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a  eturn value */..
1f8a0 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d 3e    nEntry = pBt->
1f8b0 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20 20  usableSize/5;.  
1f8c0 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65 65  nPtrmap = (nFree
1f8d0 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50 41  -nOrig+PTRMAP_PA
1f8e0 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67 29  GENO(pBt, nOrig)
1f8f0 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79 3b  +nEntry)/nEntry;
1f900 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20  .  nFin = nOrig 
1f910 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
1f920 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e 50  p;.  if( nOrig>P
1f930 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1f940 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50 45  (pBt) && nFin<PE
1f950 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f960 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1f970 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  --;.  }.  while(
1f980 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1f990 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
1f9a0 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
1f9b0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1f9c0 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20   nFin--;.  }..  
1f9d0 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a  return nFin;.}..
1f9e0 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  /*.** A write-tr
1f9f0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1fa00 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65 20  e opened before 
1fa10 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
1fa20 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65 72  ction..** It per
1fa30 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20 75  forms a single u
1fa40 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77 61  nit of work towa
1fa50 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  rds an increment
1fa60 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a  al vacuum..**.**
1fa70 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   If the incremen
1fa80 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66 69  tal vacuum is fi
1fa90 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68 69  nished after thi
1faa0 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 72  s function has r
1fab0 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 4f  un,.** SQLITE_DO
1fac0 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  NE is returned. 
1fad0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69 6e  If it is not fin
1fae0 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65 72  ished, but no er
1faf0 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a 2a  ror occurred,.**
1fb00 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fb10 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
1fb20 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
1fb30 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
1fb40 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
1fb50 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
1fb60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
1fb70 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1fb80 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
1fb90 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1fba0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1fbb0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1fbc0 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e 69  NS_WRITE && p->i
1fbd0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1fbe0 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70 42  ITE );.  if( !pB
1fbf0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1fc00 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1fc10 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _DONE;.  }else{.
1fc20 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
1fc30 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
1fc40 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e  pBt);.    Pgno n
1fc50 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65 28  Free = get4byte(
1fc60 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1fc70 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50 67  ata[36]);.    Pg
1fc80 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44  no nFin = finalD
1fc90 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67  bSize(pBt, nOrig
1fca0 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20 69  , nFree);..    i
1fcb0 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29 7b  f( nOrig<nFin ){
1fcc0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1fcd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1fce0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
1fcf0 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Free>0 ){.      
1fd00 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
1fd10 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
1fd20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1fd30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fd40 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
1fd50 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1fd60 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
1fd70 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1fd80 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69 67  pBt, nFin, nOrig
1fd90 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1fda0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fdb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1fdc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fdd0 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
1fde0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
1fdf0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1fe00 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1fe10 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50  ata[28], pBt->nP
1fe20 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
1fe30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1fe40 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1fe50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1fe60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1fe70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1fe80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1fe90 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1fea0 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65 33  prior to sqlite3
1feb0 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e  PagerCommit when
1fec0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1fed0 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 66  * is committed f
1fee0 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  or an auto-vacuu
1fef0 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  m database..**.*
1ff00 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69  * If SQLITE_OK i
1ff10 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 6e  s returned, then
1ff20 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65 74   *pnTrunc is set
1ff30 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1ff40 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20 64  f pages.** the d
1ff50 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
1ff60 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
1ff70 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20 63   to during the c
1ff80 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20 0a  ommit process. .
1ff90 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74 61  ** i.e. the data
1ffa0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72 65  base has been re
1ffb0 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68 61  organized so tha
1ffc0 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73 74  t only the first
1ffd0 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61 67   *pnTrunc.** pag
1ffe0 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a 2a  es are in use..*
1fff0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74  /.static int aut
20000 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42 74  oVacuumCommit(Bt
20010 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
20020 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20030 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
20040 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
20050 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 69  r;.  VVA_ONLY( i
20060 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  nt nRef = sqlite
20070 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
20080 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73 73  Pager); )..  ass
20090 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
200a0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
200b0 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64  ex) );.  invalid
200c0 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
200d0 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65  che(pBt);.  asse
200e0 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  rt(pBt->autoVacu
200f0 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d  um);.  if( !pBt-
20100 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20  >incrVacuum ){. 
20110 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20 20     Pgno nFin;   
20120 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20130 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74 61  of pages in data
20140 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f 76  base after autov
20150 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20 20  acuuming */.    
20160 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20 20  Pgno nFree;     
20170 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
20180 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
20190 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20  elist initially 
201a0 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72 65  */.    Pgno iFre
201b0 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  e;        /* The
201c0 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62 65   next page to be
201d0 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50 67   freed */.    Pg
201e0 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20 20  no nOrig;       
201f0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69 7a   /* Database siz
20200 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  e before freeing
20210 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20 3d   */..    nOrig =
20220 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
20230 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50 54  pBt);.    if( PT
20240 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
20250 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69 67   nOrig) || nOrig
20260 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
20270 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
20280 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20 70    /* It is not p
20290 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61 74  ossible to creat
202a0 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f 72  e a database for
202b0 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61 6c   which the final
202c0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69   page.      ** i
202d0 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74  s either a point
202e0 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20 74  er-map page or t
202f0 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20  he pending-byte 
20300 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20 20  page. If one.   
20310 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e 74     ** is encount
20320 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69 63  ered, this indic
20330 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ates corruption.
20340 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
20350 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
20360 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20370 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67  }..    nFree = g
20380 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
20390 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
203a0 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69 6e  ;.    nFin = fin
203b0 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
203c0 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20 20  rig, nFree);.   
203d0 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67 20   if( nFin>nOrig 
203e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
203f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20400 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69 67    if( nFin<nOrig
20410 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
20420 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
20430 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  t, 0, 0);.    }.
20440 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e 4f      for(iFree=nO
20450 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e 20  rig; iFree>nFin 
20460 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
20470 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20 20  ; iFree--){.    
20480 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
20490 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c  mStep(pBt, nFin,
204a0 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20 20   iFree, 1);.    
204b0 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
204c0 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
204d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
204e0 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
204f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20500 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61  erWrite(pBt->pPa
20510 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
20520 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20530 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
20540 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20  a[32], 0);.     
20550 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
20560 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
20570 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74  ], 0);.      put
20580 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
20590 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 6e  e1->aData[28], n
205a0 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  Fin);.      pBt-
205b0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
205c0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
205d0 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 7d  ge = nFin;.    }
205e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
205f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20600 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
20610 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
20620 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
20630 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65 33  t( nRef>=sqlite3
20640 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50  PagerRefcount(pP
20650 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75 72  ager) );.  retur
20660 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f  n rc;.}..#else /
20670 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  * ifndef SQLITE_
20680 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
20690 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74 43  */.# define setC
206a0 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20 53  hildPtrmaps(x) S
206b0 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a  QLITE_OK.#endif.
206c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
206d0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
206e0 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74 77  st phase of a tw
206f0 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  o-phase commit. 
20700 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
20710 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62 61   causes a rollba
20720 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65  ck journal to be
20730 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74 20   created (if it 
20740 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
20750 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20 70   exist).** and p
20760 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65 6e  opulated with en
20770 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ough information
20780 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70 6f   so that if a po
20790 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73 0a  wer loss occurs.
207a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
207b0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
207c0 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
207d0 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e 67  state by playing
207e0 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75   back.** the jou
207f0 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65 20  rnal.  Then the 
20800 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
20810 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75 73  journal are flus
20820 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74 68  hed out to.** th
20830 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20 74  e disk.  After t
20840 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 61  he journal is sa
20850 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20 74  fely on oxide, t
20860 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  he changes to th
20870 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61 72  e.** database ar
20880 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
20890 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
208a0 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f 20   and flushed to 
208b0 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68 65  oxide..** At the
208c0 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61 6c   end of this cal
208d0 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  l, the rollback 
208e0 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65 78  journal still ex
208f0 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ists on the.** d
20900 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20 73  isk and we are s
20910 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c 6c  till holding all
20920 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20 74   locks, so the t
20930 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6e  ransaction has n
20940 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  ot.** committed.
20950 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74 72    See sqlite3Btr
20960 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
20970 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e  () for the secon
20980 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a  d phase of the.*
20990 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  * commit process
209a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ..**.** This cal
209b0 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  l is a no-op if 
209c0 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  no write-transac
209d0 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
209e0 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e  y active on pBt.
209f0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
20a00 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62  , sync the datab
20a10 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
20a20 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73   btree pBt. zMas
20a30 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a  ter points to.**
20a40 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
20a50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
20a60 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
20a70 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
20a80 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c  he.** individual
20a90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f   journal file, o
20aa0 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63  r is NULL, indic
20ab0 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20  ating no master 
20ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
20ad0 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73   (single databas
20ae0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
20af0 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  **.** When this 
20b00 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d  is called, the m
20b10 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68  aster journal sh
20b20 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76  ould already hav
20b30 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65  e been.** create
20b40 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  d, populated wit
20b50 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70  h this journal p
20b60 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65  ointer and synce
20b70 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
20b80 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f   Once this is ro
20b90 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e  utine has return
20ba0 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69  ed, the only thi
20bb0 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63  ng required to c
20bc0 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69  ommit.** the wri
20bd0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  te-transaction f
20be0 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
20bf0 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65   file is to dele
20c00 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
20c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
20c20 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
20c30 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73  e(Btree *p, cons
20c40 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
20c50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20c60 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
20c70 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
20c80 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53  WRITE ){.    BtS
20c90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20ca0 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
20cb0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
20cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
20cd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
20ce0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
20cf0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  acuum ){.      r
20d00 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f  c = autoVacuumCo
20d10 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20  mmit(pBt);.     
20d20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20d30 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
20d40 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
20d50 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
20d60 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
20d70 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
20d80 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29 7b  ->bDoTruncate ){
20d90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
20da0 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65  gerTruncateImage
20db0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 42  (pBt->pPager, pB
20dc0 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 7d  t->nPage);.    }
20dd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20 3d  .#endif.    rc =
20de0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
20df0 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2d  mitPhaseOne(pBt-
20e00 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  >pPager, zMaster
20e10 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
20e20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
20e30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
20e50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
20e60 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72 65  d from both Btre
20e70 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
20e80 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c 62  ) and BtreeRollb
20e90 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65 20  ack().** at the 
20ea0 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61 20  conclusion of a 
20eb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
20ec0 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
20ed0 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
20ee0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
20ef0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
20f00 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
20f10 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
20f20 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
20f30 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20  eeHoldsMutex(p) 
20f40 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
20f50 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
20f60 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  UM.  pBt->bDoTru
20f70 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  ncate = 0;.#endi
20f80 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  f.  if( p->inTra
20f90 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  ns>TRANS_NONE &&
20fa0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 31   db->nVdbeRead>1
20fb0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
20fc0 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61 63  ere are other ac
20fd0 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 20  tive statements 
20fe0 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 74  that belong to t
20ff0 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20 20  his database.   
21000 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77 6e   ** handle, down
21010 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64 2d  grade to a read-
21020 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  only transaction
21030 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61 74  . The other stat
21040 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d 61  ements.    ** ma
21050 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69  y still be readi
21060 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ng from the data
21070 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64 6f  base.  */.    do
21080 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64  wngradeAllShared
21090 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
210a0 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61  p);.    p->inTra
210b0 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  ns = TRANS_READ;
210c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
210d0 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
210e0 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74  ad any kind of t
210f0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c  ransaction open,
21100 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20 0a   decrement the .
21110 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
21120 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  on count of the 
21130 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
21140 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
21150 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20 72   count .    ** r
21160 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74 68  eaches 0, set th
21170 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20 74  e shared state t
21180 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68  o TRANS_NONE. Th
21190 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  e unlockBtreeIfU
211a0 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20 63  nused().    ** c
211b0 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20 75  all below will u
211c0 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72 2e  nlock the pager.
211d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
211e0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
211f0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  ONE ){.      cle
21200 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  arAllSharedCache
21210 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
21220 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
21230 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20 20  action--;.      
21240 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61  if( 0==pBt->nTra
21250 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
21260 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
21270 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
21280 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
21290 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
212a0 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
212b0 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20  action state to 
212c0 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75  TRANS_NONE and u
212d0 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20 2a  nlock the .    *
212e0 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73 20  * pager if this 
212f0 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65 20  call closed the 
21300 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72 69  only read or wri
21310 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  te transaction. 
21320 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61   */.    p->inTra
21330 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
21340 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
21350 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
21360 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
21370 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rity(p);.}../*.*
21380 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  * Commit the tra
21390 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
213a0 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  ly in progress..
213b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
213c0 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  ne implements th
213d0 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20 6f  e second phase o
213e0 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d 6d  f a 2-phase comm
213f0 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c 69  it.  The.** sqli
21400 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21410 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e 65  aseOne() routine
21420 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
21430 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
21440 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 70  .** be invoked p
21450 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
21460 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
21470 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  he sqlite3BtreeC
21480 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 0a  ommitPhaseOne().
21490 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20 61  ** routine did a
214a0 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
214b0 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
214c0 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
214d0 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
214e0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
214f0 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
21500 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
21510 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
21520 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
21530 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
21540 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
21550 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65 61   or zero the hea
21560 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74 68  der in the.** th
21570 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
21580 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65 73  al (which causes
21590 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
215a0 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 0a   to commit) and.
215b0 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a 2a  ** drop locks..*
215c0 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  *.** Normally, i
215d0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
215e0 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  s while the page
215f0 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65 6d  r layer is attem
21600 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69 6e  pting to .** fin
21610 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c  alize the underl
21620 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ying journal fil
21630 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
21640 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
21650 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70 70  r and.** the upp
21660 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61 74  er layer will at
21670 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63 6b  tempt a rollback
21680 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  . However, if th
21690 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
216a0 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  t.** is non-zero
216b0 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72 65   then this b-tre
216c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
216d0 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69   part of a multi
216e0 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73 61  -file .** transa
216f0 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20 63  ction. In this c
21700 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61 63  ase, the transac
21710 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
21720 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   been committed 
21730 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e 67  .** (by deleting
21740 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
21750 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65 20  l file) and the 
21760 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e 6f  caller will igno
21770 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  re this .** func
21780 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f 64  tions return cod
21790 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20 61  e. So, even if a
217a0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
217b0 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  n the pager laye
217c0 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  r,.** reset the 
217d0 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20 69  b-tree objects i
217e0 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74 6f  nternal state to
217f0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
21800 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61 6e  he write.** tran
21810 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e  saction has been
21820 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69 73   closed. This is
21830 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73 20   quite safe, as 
21840 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20 68  the pager will h
21850 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ave.** transitio
21860 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ned to the error
21870 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   state..**.** Th
21880 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
21890 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
218a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
218b0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
218c0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
218d0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
218e0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
218f0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
21900 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
21910 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
21920 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e 75   *p, int bCleanu
21930 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e  p){..  if( p->in
21940 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
21950 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  E ) return SQLIT
21960 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 42  E_OK;.  sqlite3B
21970 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21980 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
21990 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
219a0 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
219b0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
219c0 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
219d0 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
219e0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
219f0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
21a00 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
21a10 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
21a20 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
21a30 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
21a40 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42 74    int rc;.    Bt
21a50 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
21a60 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72 74  >pBt;.    assert
21a70 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
21a80 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
21a90 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
21aa0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
21ab0 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  on>0 );.    rc =
21ac0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
21ad0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d  mitPhaseTwo(pBt-
21ae0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
21af0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21b00 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20 29  && bCleanup==0 )
21b10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
21b20 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
21b30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21b40 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61 74     }.    p->iDat
21b50 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a 20  aVersion--;  /* 
21b60 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20 70  Compensate for p
21b70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72 73  Pager->iDataVers
21b80 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70 42  ion++; */.    pB
21b90 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
21ba0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
21bb0 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73     btreeClearHas
21bc0 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20  Content(pBt);.  
21bd0 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61  }..  btreeEndTra
21be0 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73  nsaction(p);.  s
21bf0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
21c00 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
21c10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
21c20 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
21c30 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
21c40 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
21c50 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
21c60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
21c70 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21c80 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
21c90 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
21ca0 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
21cb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21cc0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
21cd0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
21ce0 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b 0a  PhaseTwo(p, 0);.
21cf0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
21d00 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
21d10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21d20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
21d30 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
21d40 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
21d50 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
21d60 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
21d70 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
21d80 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64 20  on any BtShared 
21d90 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72  that pBtree.** r
21da0 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20 69  eferences.  Or i
21db0 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 20  f the writeOnly 
21dc0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 31  flag is set to 1
21dd0 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20 74  , then only.** t
21de0 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f 72  rip write cursor
21df0 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61 64  s and leave read
21e00 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e 67   cursors unchang
21e10 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  ed..**.** Every 
21e20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e 64  cursor is a cand
21e30 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69 70  idate to be trip
21e40 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
21e50 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20 62  ursors.** that b
21e60 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20 64  elong to other d
21e70 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21e80 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
21e90 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e 67  to be.** sharing
21ea0 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
21eb0 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
21ec0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
21ed0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
21ee0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20 49  llback occurs. I
21ef0 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79 0a  f the writeOnly.
21f00 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  ** flag is true,
21f10 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65   then only write
21f20 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62 65  -cursors need be
21f30 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64 2d   tripped - read-
21f40 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73 20  only.** cursors 
21f50 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72 65  save their curre
21f60 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f 20  nt positions so 
21f70 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63 6f  that they may co
21f80 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c 6f  ntinue .** follo
21f90 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63  wing the rollbac
21fa0 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65 4f  k. Or, if writeO
21fb0 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61 6c  nly is false, al
21fc0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a 2a  l cursors are .*
21fd0 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67 65  * tripped. In ge
21fe0 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c 79  neral, writeOnly
21ff0 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65   is false if the
22000 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69   transaction bei
22010 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63  ng.** rolled bac
22020 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  k modified the d
22030 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
22040 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d 74  In this case b-t
22050 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65  ree root.** page
22060 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20 6f  s may be moved o
22070 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 74  r deleted from t
22080 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74 6f  he database alto
22090 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a 2a  gether, making.*
220a0 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72 20  * it unsafe for 
220b0 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f 20  read cursors to 
220c0 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20  continue..**.** 
220d0 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
220e0 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61 6e   flag is true an
220f0 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  d an error is en
22100 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20  countered while 
22110 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20 63  .** saving the c
22120 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
22130 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 63  of a read-only c
22140 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73 6f  ursor, all curso
22150 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  rs, .** includin
22160 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73 6f  g all read-curso
22170 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e 0a  rs are tripped..
22180 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
22190 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
221a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69 66  uccessful, or if
221b0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
221c0 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e 67   while.** saving
221d0 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69   a cursor positi
221e0 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  on, an SQLite er
221f0 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  ror code..*/.int
22200 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
22210 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
22220 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
22230 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  rrCode, int writ
22240 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72 73  eOnly){.  BtCurs
22250 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63 20  or *p;.  int rc 
22260 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
22270 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f 6e  assert( (writeOn
22280 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f 6e  ly==0 || writeOn
22290 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f 57  ly==1) && BTCF_W
222a0 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a 20  riteFlag==1 );. 
222b0 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
222c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
222d0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
222e0 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e    for(p=pBtree->
222f0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
22300 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
22310 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
22320 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
22330 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
22340 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
22350 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
22360 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
22370 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
22380 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
22390 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
223a0 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
223b0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
223c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
223d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
223e0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
223f0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
22400 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
22410 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
22420 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
22430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22440 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
22450 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
22460 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
22470 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
22480 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
22490 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
224a0 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
224b0 20 20 7d 0a 20 20 20 20 20 20 62 74 72 65 65 52    }.      btreeR
224c0 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
224d0 61 67 65 73 28 70 29 3b 0a 20 20 20 20 7d 0a 20  ages(p);.    }. 
224e0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
224f0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
22500 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22510 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
22520 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
22530 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
22540 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
22550 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
22560 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
22570 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
22580 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
22590 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
225a0 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
225b0 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
225c0 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
225d0 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
225e0 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
225f0 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
22600 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
22610 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
22620 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
22630 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
22640 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
22650 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
22660 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
22670 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
22680 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
22690 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
226a0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
226b0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
226c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
226d0 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
226e0 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
226f0 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
22700 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
22710 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
22720 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
22730 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
22740 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
22750 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
22760 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
22770 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
22780 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
22790 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
227a0 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
227b0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
227c0 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
227d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
227e0 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
227f0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
22800 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
22810 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
22820 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
22830 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
22840 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
22850 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
22860 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
22870 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
22880 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
22890 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
228a0 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
228b0 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
228c0 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
228d0 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
228e0 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
228f0 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
22900 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
22910 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
22920 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
22930 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
22940 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
22950 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
22960 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
22970 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
22980 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
22990 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
229a0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
229b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
229c0 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
229d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
229e0 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
229f0 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
22a00 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
22a10 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
22a20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
22a30 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
22a40 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
22a50 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
22a60 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
22a70 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
22a80 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
22a90 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
22aa0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
22ab0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
22ac0 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
22ad0 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
22ae0 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
22af0 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
22b00 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
22b10 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
22b20 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
22b30 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
22b40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
22b50 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
22b60 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
22b70 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
22b80 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
22b90 67 65 4f 6e 65 28 70 50 61 67 65 31 29 3b 0a 20  geOne(pPage1);. 
22ba0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22bb0 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f   countValidCurso
22bc0 72 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b  rs(pBt, 1)==0 );
22bd0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
22be0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
22bf0 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43  READ;.    btreeC
22c00 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70  learHasContent(p
22c10 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  Bt);.  }..  btre
22c20 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  eEndTransaction(
22c30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
22c40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
22c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22c60 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
22c70 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
22c80 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
22c90 61 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f  action can be ro
22ca0 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64  lled.** back ind
22cb0 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68  ependently of th
22cc0 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
22cd0 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61  on. You must sta
22ce0 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
22cf0 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72   .** before star
22d00 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
22d10 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72  ction. The subtr
22d20 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
22d30 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
22d40 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e   .** if the main
22d50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
22d60 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  mits or rolls ba
22d70 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d  ck..**.** Statem
22d80 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
22d90 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f  ons are used aro
22da0 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53  und individual S
22db0 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a  QL statements.**
22dc0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69   that are contai
22dd0 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47  ned within a BEG
22de0 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63  IN...COMMIT bloc
22df0 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61  k.  If a constra
22e00 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63  int.** error occ
22e10 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73  urs within the s
22e20 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66  tatement, the ef
22e30 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65  fect of that one
22e40 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61   statement.** ca
22e50 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n be rolled back
22e60 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
22e70 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
22e80 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69  entire transacti
22e90 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74  on..**.** A stat
22ea0 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61  ement sub-transa
22eb0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
22ec0 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79  nted as an anony
22ed0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20  mous savepoint. 
22ee0 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73  The.** value pas
22ef0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
22f00 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  d parameter is t
22f10 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
22f20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a  of savepoints,.*
22f30 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
22f40 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61  new anonymous sa
22f50 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e  vepoint, open on
22f60 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65   the B-Tree. i.e
22f70 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72  . if there.** ar
22f80 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65  e no active save
22f90 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74  points and no ot
22fa0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  her statement-tr
22fb0 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c  ansactions open,
22fc0 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69  .** iStatement i
22fd0 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d  s 1. This anonym
22fe0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61  ous savepoint ca
22ff0 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72  n be released or
23000 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20   rolled back.** 
23010 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
23020 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
23030 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ) function..*/.i
23040 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
23050 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
23060 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e  p, int iStatemen
23070 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
23080 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
23090 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
230a0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
230b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54    assert( p->inT
230c0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
230d0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  E );.  assert( (
230e0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
230f0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
23100 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
23110 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
23120 20 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d   assert( iStatem
23130 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  ent>p->db->nSave
23140 70 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72  point );.  asser
23150 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
23160 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
23170 54 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68  TE );.  /* At th
23180 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61  e pager level, a
23190 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
231a0 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65  action is a save
231b0 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20  point with.  ** 
231c0 61 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72  an index greater
231d0 20 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f   than all savepo
231e0 69 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70  ints created exp
231f0 6c 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20  licitly using.  
23200 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
23210 73 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  s. It is illegal
23220 20 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73   to open, releas
23230 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  e or rollback an
23240 79 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65  y.  ** such save
23250 70 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65  points while the
23260 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
23270 61 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74  action savepoint
23280 20 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f   is active..  */
23290 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
232a0 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
232b0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
232c0 53 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71  Statement);.  sq
232d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
232e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
232f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
23300 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
23310 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
23320 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
23330 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23340 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
23350 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
23360 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
23370 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
23380 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
23390 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
233a0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
233b0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
233c0 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
233d0 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
233e0 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
233f0 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
23400 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
23410 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
23420 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
23430 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
23440 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
23450 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
23460 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
23470 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
23480 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
23490 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
234a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
234b0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
234c0 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
234d0 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
234e0 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
234f0 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
23500 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
23510 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
23520 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
23530 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
23540 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
23550 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
23560 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
23570 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
23580 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23590 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
235a0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
235b0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
235c0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
235d0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
235e0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
235f0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
23600 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
23610 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
23620 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
23630 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
23640 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
23650 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
23660 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
23670 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
23680 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65  .      rc = save
23690 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
236a0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, 0);.    }.   
236b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
236c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
236d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
236e0 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
236f0 65 72 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69  er, op, iSavepoi
23700 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nt);.    }.    i
23710 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23720 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
23730 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
23740 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
23750 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
23760 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
23770 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
23780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23790 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
237a0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
237b0 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
237c0 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
237d0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
237e0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
237f0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
23800 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
23810 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
23820 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
23830 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
23840 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
23850 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
23860 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
23870 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
23880 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
23890 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
238a0 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
238b0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
238c0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
238d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
238e0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
238f0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
23900 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
23910 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
23920 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
23930 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
23940 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
23950 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
23960 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
23970 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
23980 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
23990 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
239a0 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
239b0 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
239c0 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
239d0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
239e0 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
239f0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
23a00 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
23a10 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
23a20 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45  *.** If the BTRE
23a30 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77  E_WRCSR bit of w
23a40 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20  rFlag is clear, 
23a50 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
23a60 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75  can only.** be u
23a70 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
23a80 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57    If the BTREE_W
23a90 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c  RCSR bit is set,
23aa0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
23ab0 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
23ac0 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
23ad0 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  or writing if ot
23ae0 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
23af0 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72  or writing.** ar
23b00 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
23b10 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  se are the condi
23b20 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
23b30 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a  be met in order.
23b40 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  ** for writing t
23b50 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  o be allowed:.**
23b60 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
23b70 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
23b80 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
23b90 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Flag containing 
23ba0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a  BTREE_WRCSR.**.*
23bb0 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
23bc0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
23bd0 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
23be0 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
23bf0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
23c00 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
23c10 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
23c20 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
23c30 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
23c40 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
23c50 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
23c60 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
23c70 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
23c80 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
23c90 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
23ca0 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
23cb0 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
23cc0 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
23cd0 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
23ce0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
23cf0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
23d00 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
23d10 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
23d20 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
23d30 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
23d40 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
23d50 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
23d60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45  .**.** The BTREE
23d70 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f  _FORDELETE bit o
23d80 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74  f wrFlag may opt
23d90 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69  ionally be set i
23da0 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  f BTREE_WRCSR.**
23db0 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52   is set.  If FOR
23dc0 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74  DELETE is set, t
23dd0 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
23de0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
23df0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  ion that.** this
23e00 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c   cursor will onl
23e10 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65  y be used to see
23e20 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20  k to and delete 
23e30 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e  entries of an in
23e40 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  dex.** as part o
23e50 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54  f a larger DELET
23e60 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
23e70 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74  e FORDELETE hint
23e80 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a   is not used by.
23e90 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** this implemen
23ea0 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20  tation.  But in 
23eb0 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61  a hypothetical a
23ec0 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61  lternative stora
23ed0 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e  ge engine .** in
23ee0 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74   which index ent
23ef0 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ries are automat
23f00 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
23f10 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  hen correspondin
23f20 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20  g table.** rows 
23f30 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65  are deleted, the
23f40 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20   FORDELETE flag 
23f50 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61  is a hint that a
23f60 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45  ll SEEK and DELE
23f70 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  TE.** operations
23f80 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
23f90 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e  can be no-ops an
23fa0 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61  d all READ opera
23fb0 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65  tions can .** re
23fc0 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20  turn a null row 
23fd0 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30  (2-bytes: 0x01 0
23fe0 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  x00)..**.** No c
23ff0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
24000 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
24010 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
24020 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
24030 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
24040 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
24050 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
24060 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
24070 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
24080 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
24090 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
240a0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
240b0 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
240c0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
240d0 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
240e0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
240f0 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
24100 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
24110 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
24120 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
24130 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
24140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24160 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
24170 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24190 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
241a0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
241b0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
241c0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
241f0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
24200 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
24210 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
24220 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
24230 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
24240 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
24250 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
24280 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
24290 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
242a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
242c0 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
242d0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75  handle */.  BtCu
242e0 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20  rsor *pX;       
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76     /* Looping ov
24310 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72  er other all cur
24320 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sors */..  asser
24330 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
24340 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
24350 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
24360 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  ==0 .       || w
24370 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43  rFlag==BTREE_WRC
24380 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  SR .       || wr
24390 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43  Flag==(BTREE_WRC
243a0 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
243b0 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  TE) .  );..  /* 
243c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
243d0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
243e0 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
243f0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
24400 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
24410 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
24420 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
24430 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
24440 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
24450 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
24460 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
24470 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
24480 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
24490 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
244a0 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
244b0 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
244c0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
244d0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
244e0 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32  fo!=0, (wrFlag?2
244f0 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  :1)) );.  assert
24500 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
24510 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
24520 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
24530 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
24540 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
24550 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
24560 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
24570 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
24580 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
24590 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
245a0 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
245b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
245c0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
245d0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
245e0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
245f0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
24600 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
24610 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
24620 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
24630 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
24640 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
24650 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
24660 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
24670 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
24680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24690 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
246a0 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
246b0 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
246c0 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
246d0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
246e0 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
246f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
24700 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
24710 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
24720 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
24730 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
24740 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
24750 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
24760 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
24770 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
24780 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
24790 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
247a0 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
247b0 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
247c0 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
247d0 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
247e0 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
247f0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63  = pBt;.  pCur->c
24800 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
24810 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   ? BTCF_WriteFla
24820 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  g : 0;.  pCur->c
24830 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77  urPagerFlags = w
24840 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45  rFlag ? 0 : PAGE
24850 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a  R_GET_READONLY;.
24860 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
24870 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
24880 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
24890 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
248a0 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73  l such.  ** curs
248b0 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20  ors *must* have 
248c0 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
248d0 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20  e flag set. */. 
248e0 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75   for(pX=pBt->pCu
248f0 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d  rsor; pX; pX=pX-
24900 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
24910 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28   pX->pgnoRoot==(
24920 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20  Pgno)iTable ){. 
24930 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67       pX->curFlag
24940 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
24950 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  le;.      pCur->
24960 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
24970 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d  _Multiple;.    }
24980 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65  .  }.  pCur->pNe
24990 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
249a0 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  r;.  pBt->pCurso
249b0 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
249c0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
249d0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
249e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
249f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
24a00 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
24a10 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
24a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a30 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
24a40 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
24a50 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
24a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a70 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
24a80 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
24a90 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
24aa0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
24ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ac0 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
24ad0 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
24ae0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
24af0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
24b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b10 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
24b20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
24b30 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
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 20 20 20 20 20 2f 2a 20 57              /* W
24b60 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
24b70 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
24b80 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c   rc;.  if( iTabl
24b90 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  e<1 ){.    rc = 
24ba0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
24bb0 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
24bc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
24bd0 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
24be0 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
24bf0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
24c00 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
24c10 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
24c20 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
24c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
24c40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
24c50 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
24c60 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
24c70 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
24c80 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
24c90 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
24ca0 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
24cb0 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
24cc0 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
24cd0 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
24ce0 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
24cf0 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
24d00 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
24d10 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
24d20 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
24d30 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
24d40 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
24d50 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
24d60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
24d70 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
24d80 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
24d90 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
24da0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
24db0 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
24dc0 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
24dd0 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
24de0 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
24df0 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
24e00 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
24e10 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
24e20 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
24e30 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
24e40 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
24e50 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
24e60 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
24e70 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
24e80 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
24e90 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
24ea0 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
24eb0 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
24ec0 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
24ed0 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
24ee0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
24ef0 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
24f00 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
24f10 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
24f20 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
24f30 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
24f40 66 28 42 74 43 75 72 73 6f 72 2c 20 42 54 43 55  f(BtCursor, BTCU
24f50 52 53 4f 52 5f 46 49 52 53 54 5f 55 4e 49 4e 49  RSOR_FIRST_UNINI
24f60 54 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  T));.}../*.** Cl
24f70 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
24f80 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
24f90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
24fa0 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
24fb0 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
24fc0 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
24fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
24fe0 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
24ff0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
25000 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
25010 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
25020 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
25030 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
25040 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
25050 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
25060 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
25070 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
25080 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
25090 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73    if( pBt->pCurs
250a0 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  or==pCur ){.    
250b0 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
250c0 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
250d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
250e0 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d  tCursor *pPrev =
250f0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
25100 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
25110 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78   if( pPrev->pNex
25120 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20  t==pCur ){.     
25130 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78       pPrev->pNex
25140 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  t = pCur->pNext;
25150 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
25160 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25170 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72 65      pPrev = pPre
25180 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  v->pNext;.      
25190 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70  }while( ALWAYS(p
251a0 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20  Prev) );.    }. 
251b0 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65 41     btreeReleaseA
251c0 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70 43  llCursorPages(pC
251d0 75 72 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42  ur);.    unlockB
251e0 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
251f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
25200 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
25210 6c 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  low);.    sqlite
25220 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
25230 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  y);.    sqlite3B
25240 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
25250 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 42 74  );.    pCur->pBt
25260 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ree = 0;.  }.  r
25270 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
25290 75 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72  ure the BtCursor
252a0 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  * given in the a
252b0 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61  rgument has a va
252c0 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e  lid.** BtCursor.
252d0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20  info structure. 
252e0 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   If it is not al
252f0 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c  ready valid, cal
25300 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  l.** btreeParseC
25310 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74  ell() to fill it
25320 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72   in..**.** BtCur
25330 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61  sor.info is a ca
25340 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72  che of the infor
25350 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75  mation in the cu
25360 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55  rrent cell..** U
25370 73 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20  sing this cache 
25380 72 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62  reduces the numb
25390 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62  er of calls to b
253a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
253b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
253c0 55 47 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  UG.  static int 
253d0 63 65 6c 6c 49 6e 66 6f 45 71 75 61 6c 28 43 65  cellInfoEqual(Ce
253e0 6c 6c 49 6e 66 6f 20 2a 61 2c 20 43 65 6c 6c 49  llInfo *a, CellI
253f0 6e 66 6f 20 2a 62 29 7b 0a 20 20 20 20 69 66 28  nfo *b){.    if(
25400 20 61 2d 3e 6e 4b 65 79 21 3d 62 2d 3e 6e 4b 65   a->nKey!=b->nKe
25410 79 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  y ) return 0;.  
25420 20 20 69 66 28 20 61 2d 3e 70 50 61 79 6c 6f 61    if( a->pPayloa
25430 64 21 3d 62 2d 3e 70 50 61 79 6c 6f 61 64 20 29  d!=b->pPayload )
25440 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
25450 66 28 20 61 2d 3e 6e 50 61 79 6c 6f 61 64 21 3d  f( a->nPayload!=
25460 62 2d 3e 6e 50 61 79 6c 6f 61 64 20 29 20 72 65  b->nPayload ) re
25470 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
25480 61 2d 3e 6e 4c 6f 63 61 6c 21 3d 62 2d 3e 6e 4c  a->nLocal!=b->nL
25490 6f 63 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  ocal ) return 0;
254a0 0a 20 20 20 20 69 66 28 20 61 2d 3e 6e 53 69 7a  .    if( a->nSiz
254b0 65 21 3d 62 2d 3e 6e 53 69 7a 65 20 29 20 72 65  e!=b->nSize ) re
254c0 74 75 72 6e 20 30 3b 0a 20 20 20 20 72 65 74 75  turn 0;.    retu
254d0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 74 61 74  rn 1;.  }.  stat
254e0 69 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65  ic void assertCe
254f0 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20  llInfo(BtCursor 
25500 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c  *pCur){.    Cell
25510 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d  Info info;.    m
25520 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
25530 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
25540 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
25550 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
25560 43 75 72 2d 3e 69 78 2c 20 26 69 6e 66 6f 29 3b  Cur->ix, &info);
25570 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52  .    assert( COR
25580 52 55 50 54 5f 44 42 20 7c 7c 20 63 65 6c 6c 49  RUPT_DB || cellI
25590 6e 66 6f 45 71 75 61 6c 28 26 69 6e 66 6f 2c 20  nfoEqual(&info, 
255a0 26 70 43 75 72 2d 3e 69 6e 66 6f 29 20 29 3b 0a  &pCur->info) );.
255b0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66    }.#else.  #def
255c0 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e  ine assertCellIn
255d0 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61  fo(x).#endif.sta
255e0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
255f0 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c  INE void getCell
25600 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70  Info(BtCursor *p
25610 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72  Cur){.  if( pCur
25620 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
25630 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72  ){.    pCur->cur
25640 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61  Flags |= BTCF_Va
25650 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72  lidNKey;.    btr
25660 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
25670 2d 3e 70 50 61 67 65 2c 70 43 75 72 2d 3e 69 78  ->pPage,pCur->ix
25680 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
25690 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
256a0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
256b0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
256c0 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
256d0 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
256e0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
256f0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
25700 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
25710 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
25720 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
25730 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
25740 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
25750 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
25760 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
25770 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
25780 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
25790 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
257a0 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
257b0 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
257c0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
257d0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
257e0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
257f0 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
25800 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
25810 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
25820 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25830 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
25840 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74  /* NDEBUG */.int
25850 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
25860 73 6f 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43  sorIsValidNN(BtC
25870 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
25880 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20  assert( pCur!=0 
25890 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72  );.  return pCur
258a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
258b0 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _VALID;.}../*.**
258c0 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
258d0 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
258e0 20 6b 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20   key or "rowid" 
258f0 66 6f 72 20 61 20 74 61 62 6c 65 20 62 74 72 65  for a table btre
25900 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  e..** This routi
25910 6e 65 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64  ne is only valid
25920 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
25930 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
25940 6e 74 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72  nto a.** ordinar
25950 79 20 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20  y table btree.  
25960 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  If the cursor po
25970 69 6e 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78  ints to an index
25980 20 62 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20   btree or.** is 
25990 69 6e 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73  invalid, the res
259a0 75 6c 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ult of this rout
259b0 69 6e 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ine is undefined
259c0 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33  ..*/.i64 sqlite3
259d0 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28  BtreeIntegerKey(
259e0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
259f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25a00 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25a10 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
25a20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
25a30 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
25a40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72  ssert( pCur->cur
25a50 49 6e 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43  IntKey );.  getC
25a60 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
25a70 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e   return pCur->in
25a80 66 6f 2e 6e 4b 65 79 3b 0a 7d 0a 0a 23 69 66 64  fo.nKey;.}..#ifd
25a90 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
25aa0 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e 43  _OFFSET_SQL_FUNC
25ab0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
25ac0 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  e offset into th
25ad0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25ae0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
25af0 20 74 68 65 0a 2a 2a 20 70 61 79 6c 6f 61 64 20   the.** payload 
25b00 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
25b10 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 2e  sor is pointing.
25b20 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42  .*/.i64 sqlite3B
25b30 74 72 65 65 4f 66 66 73 65 74 28 42 74 43 75 72  treeOffset(BtCur
25b40 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
25b50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
25b60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
25b70 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25b80 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25b90 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c  ALID );.  getCel
25ba0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
25bb0 65 74 75 72 6e 20 28 69 36 34 29 70 43 75 72 2d  eturn (i64)pCur-
25bc0 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  >pBt->pageSize*(
25bd0 28 69 36 34 29 70 43 75 72 2d 3e 70 50 61 67 65  (i64)pCur->pPage
25be0 2d 3e 70 67 6e 6f 20 2d 20 31 29 20 2b 0a 20 20  ->pgno - 1) +.  
25bf0 20 20 20 20 20 20 20 28 69 36 34 29 28 70 43 75         (i64)(pCu
25c00 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
25c10 20 2d 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   - pCur->pPage->
25c20 61 44 61 74 61 29 3b 0a 7d 0a 23 65 6e 64 69 66  aData);.}.#endif
25c30 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
25c40 45 5f 4f 46 46 53 45 54 5f 53 51 4c 5f 46 55 4e  E_OFFSET_SQL_FUN
25c50 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  C */../*.** Retu
25c60 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
25c70 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61   bytes of payloa
25c80 64 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  d for the entry 
25c90 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a 2a 20  that pCur is.** 
25ca0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
25cb0 6e 67 20 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c  ng to.  For tabl
25cc0 65 20 62 74 72 65 65 73 2c 20 74 68 69 73 20 77  e btrees, this w
25cd0 69 6c 6c 20 62 65 20 74 68 65 20 61 6d 6f 75 6e  ill be the amoun
25ce0 74 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 20 46  t.** of data.  F
25cf0 6f 72 20 69 6e 64 65 78 20 62 74 72 65 65 73 2c  or index btrees,
25d00 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68   this will be th
25d10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6b 65  e size of the ke
25d20 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
25d30 6c 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ler must guarant
25d40 65 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ee that the curs
25d50 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
25d60 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20  o a non-NULL.** 
25d70 76 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e  valid entry.  In
25d80 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68   other words, th
25d90 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
25da0 75 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74  ure must guarant
25db0 65 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ee.** that the c
25dc0 75 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72  ursor has Cursor
25dd0 2e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  .eState==CURSOR_
25de0 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71  VALID..*/.u32 sq
25df0 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61  lite3BtreePayloa
25e00 64 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  dSize(BtCursor *
25e10 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
25e20 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
25e30 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
25e40 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
25e50 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
25e60 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f  );.  getCellInfo
25e70 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
25e80 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
25e90 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  load;.}../*.** G
25ea0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
25eb0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
25ec0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
25ed0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
25ee0 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
25ef0 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
25f00 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
25f10 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
25f20 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
25f30 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
25f40 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
25f50 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
25f60 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
25f70 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
25f80 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
25f90 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
25fa0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
25fb0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
25fc0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
25fd0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
25fe0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
25ff0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
26000 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
26010 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
26020 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
26030 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
26040 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
26050 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
26060 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
26070 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
26080 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
26090 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
260a0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
260b0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
260c0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
260d0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
260e0 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
260f0 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
26100 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
26110 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
26120 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
26130 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
26140 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
26150 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
26160 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
26170 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
26180 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
26190 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
261a0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
261b0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
261c0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
261d0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
261e0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
261f0 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
26200 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
26210 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
26220 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
26230 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
26240 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
26250 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
26260 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
26270 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
26280 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
26290 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
262a0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
262b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
262c0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
262d0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
262e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
262f0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
26300 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
26310 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
26320 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
26330 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
26340 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
26350 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
26360 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
26370 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
26380 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
26390 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
263a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
263b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
263c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
263d0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
263e0 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
263f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26400 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
26410 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
26420 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
26430 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
26440 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
26450 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
26460 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
26470 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
26480 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
26490 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
264a0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
264b0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
264c0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
264d0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
264e0 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
264f0 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
26500 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
26510 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
26520 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
26530 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
26540 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
26550 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
26560 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
26570 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
26580 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
26590 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
265a0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
265b0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
265c0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
265d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
265e0 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
265f0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
26600 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
26610 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
26620 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
26630 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
26640 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
26650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
26660 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
26670 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
26680 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
26690 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
266a0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
266b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
266c0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
266d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
266e0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
266f0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
26700 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
26710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26720 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
26730 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
26740 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
26750 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
26760 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
26770 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
26780 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
26790 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
267a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
267b0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
267c0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
267d0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
267e0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
267f0 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
26800 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
26810 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
26820 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
26830 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
26840 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
26850 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
26860 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
26870 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
26880 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
26890 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
268a0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
268b0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
268c0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
268d0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
268e0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
268f0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
26900 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
26910 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
26920 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
26930 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
26940 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
26950 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
26960 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
26970 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
26980 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
26990 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
269a0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
269b0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
269c0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
269d0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
269e0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
269f0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
26a00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
26a10 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
26a20 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
26a30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
26a40 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
26a50 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
26a60 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
26a70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
26a80 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
26a90 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
26aa0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
26ab0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
26ac0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26ae0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
26af0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
26b00 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
26b10 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
26b20 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
26b30 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
26b40 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
26b50 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
26b60 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
26b70 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
26b80 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
26b90 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
26ba0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
26bb0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
26bc0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
26bd0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
26be0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
26bf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
26c00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26c10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
26c20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
26c30 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
26c40 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
26c50 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
26c60 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
26c70 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
26c80 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
26c90 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
26ca0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
26cb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
26cc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
26cd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
26ce0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
26cf0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
26d00 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
26d10 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
26d20 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
26d30 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
26d40 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
26d50 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
26d60 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
26d70 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
26d80 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
26d90 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
26da0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
26db0 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
26dc0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
26dd0 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
26de0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
26df0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
26e00 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
26e10 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
26e20 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
26e30 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
26e40 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
26e50 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
26e60 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
26e70 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
26e80 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
26e90 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
26ea0 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
26eb0 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
26ec0 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
26ed0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
26ee0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
26ef0 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
26f00 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
26f10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
26f20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
26f30 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73  n may allocate s
26f40 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a  pace for and laz
26f50 69 6c 79 20 70 6f 70 75 6c 61 74 65 0a 2a 2a 20  ily populate.** 
26f60 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
26f70 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72 72  e-list cache arr
26f80 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
26f90 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62  erflow). .** Sub
26fa0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
26fb0 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f 20  e this cache to 
26fc0 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
26fd0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
26fe0 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66  set .** more eff
26ff0 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  icient..**.** On
27000 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ce an overflow p
27010 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68  age-list cache h
27020 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
27030 64 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 2a 2a  d, it must be.**
27040 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
27050 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
27060 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
27070 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
27080 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
27090 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
270a0 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
270b0 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
270c0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
270d0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
270e0 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
270f0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
27100 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
27110 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
27120 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
27130 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
27140 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
27150 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
27160 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
27170 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
27180 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
27190 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
271a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
271b0 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
271c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
271d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
271e0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
271f0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
27200 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
27210 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
27220 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
27230 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
27240 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
27250 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
27260 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
27270 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
27280 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
27290 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
272a0 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
272b0 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
272c0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
272d0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
272e0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
272f0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
27300 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
27310 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27320 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
27330 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
27340 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
27350 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
27360 20 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20    /* Btree page 
27370 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
27380 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
27390 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
273a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273b0 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
273c0 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
273d0 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
273e0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
273f0 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
27400 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
27410 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
27420 3b 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 6f  ;     /* Start o
27430 66 20 6f 72 69 67 69 6e 61 6c 20 6f 75 74 20 62  f original out b
27440 75 66 66 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  uffer */.#endif.
27450 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
27460 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f   );.  assert( eO
27470 70 3d 3d 30 20 7c 7c 20 65 4f 70 3d 3d 31 20 29  p==0 || eOp==1 )
27480 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27490 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
274a0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
274b0 72 74 28 20 70 43 75 72 2d 3e 69 78 3c 70 50 61  rt( pCur->ix<pPa
274c0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
274d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
274e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
274f0 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ..  getCellInfo(
27500 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
27510 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
27520 50 61 79 6c 6f 61 64 3b 0a 20 20 61 73 73 65 72  Payload;.  asser
27530 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  t( offset+amt <=
27540 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79   pCur->info.nPay
27550 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73 73 65 72  load );..  asser
27560 74 28 20 61 50 61 79 6c 6f 61 64 20 3e 20 70 50  t( aPayload > pP
27570 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
27580 69 66 28 20 28 75 70 74 72 29 28 61 50 61 79 6c  if( (uptr)(aPayl
27590 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e 61 44 61  oad - pPage->aDa
275a0 74 61 29 20 3e 20 28 70 42 74 2d 3e 75 73 61 62  ta) > (pBt->usab
275b0 6c 65 53 69 7a 65 20 2d 20 70 43 75 72 2d 3e 69  leSize - pCur->i
275c0 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29 7b 0a 20  nfo.nLocal) ){. 
275d0 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
275e0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
275f0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
27600 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
27610 6f 72 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20  or.  The.    ** 
27620 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76  conditional abov
27630 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a 20 20 20  e is really:.   
27640 20 2a 2a 20 20 20 20 26 61 50 61 79 6c 6f 61 64   **    &aPayload
27650 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
27660 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
27670 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
27680 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62 75 74 20  ize].    ** but 
27690 69 73 20 72 65 63 61 73 74 20 69 6e 74 6f 20 69  is recast into i
276a0 74 73 20 63 75 72 72 65 6e 74 20 66 6f 72 6d 20  ts current form 
276b0 74 6f 20 61 76 6f 69 64 20 69 6e 74 65 67 65 72  to avoid integer
276c0 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f 62 6c 65   overflow proble
276d0 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  ms.    */.    re
276e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
276f0 55 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b  UPT_PAGE(pPage);
27700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
27710 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
27720 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
27730 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
27740 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
27750 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
27760 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
27770 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
27780 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
27790 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
277a0 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
277b0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
277c0 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
277d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
277e0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
277f0 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
27800 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
27810 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
27820 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
27830 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
27840 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
27850 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
27860 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27870 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
27880 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27890 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
278a0 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
278b0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
278c0 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
278d0 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
278e0 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
278f0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
27900 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
27910 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
27920 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
27930 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
27940 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
27950 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
27960 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
27970 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
27980 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
27990 54 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  The aOverflow[] 
279a0 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
279b0 74 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20  t one entry for 
279c0 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61  each overflow pa
279d0 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65  ge.    ** in the
279e0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
279f0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
27a00 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76   of the first ov
27a10 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20  erflow page is. 
27a20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20     ** stored in 
27a30 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74  aOverflow[0], et
27a40 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20  c. A value of 0 
27a50 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  in the aOverflow
27a60 5b 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20  [] array.    ** 
27a70 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
27a80 6e 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65  nown" (the cache
27a90 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c   is lazily popul
27aa0 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ated)..    */.  
27ab0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
27ac0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
27ad0 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20  idOvfl)==0 ){.  
27ae0 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
27af0 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
27b00 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
27b10 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
27b20 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
27b30 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
27b40 65 72 66 6c 6f 77 3d 3d 30 0a 20 20 20 20 20 20  erflow==0.      
27b50 20 7c 7c 20 6e 4f 76 66 6c 2a 28 69 6e 74 29 73   || nOvfl*(int)s
27b60 69 7a 65 6f 66 28 50 67 6e 6f 29 20 3e 20 73 71  izeof(Pgno) > sq
27b70 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a 65 28  lite3MallocSize(
27b80 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
27b90 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
27ba0 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
27bb0 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
27bc0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
27bd0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
27be0 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
27bf0 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
27c00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
27c10 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
27c20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27c30 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
27c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27c50 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
27c60 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20  erflow = aNew;. 
27c70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
27c80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43  .      memset(pC
27c90 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30  ur->aOverflow, 0
27ca0 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50  , nOvfl*sizeof(P
27cb0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 70 43 75  gno));.      pCu
27cc0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
27cd0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
27ce0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27cf0 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
27d00 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
27d10 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
27d20 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
27d30 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
27d40 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
27d50 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
27d60 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
27d70 0a 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74  .      ** direct
27d80 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 20 20  ly to it..      
27d90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
27da0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
27db0 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
27dc0 0a 20 20 20 20 20 20 20 20 69 49 64 78 20 3d 20  .        iIdx = 
27dd0 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
27de0 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 50  );.        nextP
27df0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
27e00 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
27e10 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
27e20 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
27e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
27e40 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
27e50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
27e60 3e 30 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  >0 );.    while(
27e70 20 6e 65 78 74 50 61 67 65 20 29 7b 0a 20 20 20   nextPage ){.   
27e80 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
27e90 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
27ea0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
27eb0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
27ec0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
27ed0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
27ee0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
27ef0 20 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72    || pCur->aOver
27f00 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
27f10 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20  Page.           
27f20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42     || CORRUPT_DB
27f30 20 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   );.      pCur->
27f40 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20  aOverflow[iIdx] 
27f50 3d 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  = nextPage;..   
27f60 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
27f70 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
27f80 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
27f90 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
27fa0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
27fb0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
27fc0 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
27fd0 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
27fe0 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
27ff0 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
28000 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
28010 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
28020 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
28030 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
28040 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
28050 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
28060 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
28070 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
28080 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
28090 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
280a0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
280b0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
280c0 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
280d0 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
280e0 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  fl );.        as
280f0 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72  sert( pCur->pBtr
28100 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20  ee->db==pBt->db 
28110 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
28120 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28130 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
28140 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
28150 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
28160 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
28170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28180 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
28190 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
281a0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
281b0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
281c0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
281d0 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
281e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
281f0 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
28200 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
28210 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
28220 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
28230 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
28240 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
28250 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
28260 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
28270 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
28280 20 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20          int a = 
28290 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  amt;.        if(
282a0 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76   a + offset > ov
282b0 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  flSize ){.      
282c0 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65      a = ovflSize
282d0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
282e0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
282f0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
28300 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
28310 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65 20 66   /* If all the f
28320 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75  ollowing are tru
28330 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e:.        **.  
28340 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20 74 68        **   1) th
28350 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
28360 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20 20 20  ration, and .   
28370 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64 61 74       **   2) dat
28380 61 20 69 73 20 72 65 71 75 69 72 65 64 20 66 72  a is required fr
28390 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  om the start of 
283a0 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 70 61  this overflow pa
283b0 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ge, and.        
283c0 2a 2a 20 20 20 33 29 20 74 68 65 72 65 20 61 72  **   3) there ar
283d0 65 20 6e 6f 20 64 69 72 74 79 20 70 61 67 65 73  e no dirty pages
283e0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
283f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  he.        **   
28400 34 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  4) the database 
28410 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20  is file-backed, 
28420 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
28430 20 35 29 20 74 68 65 20 70 61 67 65 20 69 73 20   5) the page is 
28440 6e 6f 74 20 69 6e 20 74 68 65 20 57 41 4c 20 66  not in the WAL f
28450 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  ile.        **  
28460 20 36 29 20 61 74 20 6c 65 61 73 74 20 34 20 62   6) at least 4 b
28470 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61 64  ytes have alread
28480 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f  y been read into
28490 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
284a0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  er .        **. 
284b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64         ** then d
284c0 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64 20  ata can be read 
284d0 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68  directly from th
284e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
284f0 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
28500 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65   ** output buffe
28510 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65  r, bypassing the
28520 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f   page-cache alto
28530 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70 65  gether. This spe
28540 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  eds.        ** u
28550 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20  p loading large 
28560 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70 61  records that spa
28570 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  n many overflow 
28580 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  pages..        *
28590 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f  /.        if( eO
285a0 70 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  p==0            
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20   /* (1) */.     
285e0 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30      && offset==0
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
28620 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
28630 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 65  sqlite3PagerDire
28640 63 74 52 65 61 64 4f 6b 28 70 42 74 2d 3e 70 50  ctReadOk(pBt->pP
28650 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 29 20  ager, nextPage) 
28660 20 20 20 2f 2a 20 28 33 2c 34 2c 35 29 20 2a 2f     /* (3,4,5) */
28670 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42  .         && &pB
28680 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72  uf[-4]>=pBufStar
28690 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
286a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286b0 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
286c0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
286d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
286e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
286f0 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  le(pBt->pPager);
28700 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 61 53  .          u8 aS
28710 61 76 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20  ave[4];.        
28720 20 20 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26    u8 *aWrite = &
28730 70 42 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20  pBuf[-4];.      
28740 20 20 20 20 61 73 73 65 72 74 28 20 61 57 72 69      assert( aWri
28750 74 65 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b  te>=pBufStart );
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28770 20 20 20 20 20 20 20 20 20 2f 2a 20 64 75 65 20           /* due 
28780 74 6f 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  to (6) */.      
28790 20 20 20 20 6d 65 6d 63 70 79 28 61 53 61 76 65      memcpy(aSave
287a0 2c 20 61 57 72 69 74 65 2c 20 34 29 3b 0a 20 20  , aWrite, 4);.  
287b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
287c0 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
287d0 57 72 69 74 65 2c 20 61 2b 34 2c 20 28 69 36 34  Write, a+4, (i64
287e0 29 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28  )pBt->pageSize*(
287f0 6e 65 78 74 50 61 67 65 2d 31 29 29 3b 0a 20 20  nextPage-1));.  
28800 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
28810 20 3d 20 67 65 74 34 62 79 74 65 28 61 57 72 69   = get4byte(aWri
28820 74 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  te);.          m
28830 65 6d 63 70 79 28 61 57 72 69 74 65 2c 20 61 53  emcpy(aWrite, aS
28840 61 76 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ave, 4);.       
28850 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
28860 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
28870 20 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61     DbPage *pDbPa
28880 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ge;.          rc
28890 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
288a0 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
288b0 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62 50 61  nextPage, &pDbPa
288c0 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
288d0 20 20 28 65 4f 70 3d 3d 30 20 3f 20 50 41 47 45    (eOp==0 ? PAGE
288e0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
288f0 20 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b   0).          );
28900 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
28910 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28920 20 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79              aPay
28930 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61  load = sqlite3Pa
28940 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
28950 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
28960 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
28970 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
28980 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
28990 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
289a0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
289b0 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
289c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
289d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
289e0 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29  erUnref(pDbPage)
289f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 66  ;.            of
28a00 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
28a10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
28a20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
28a30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 6d  ;.        if( am
28a40 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  t==0 ) return rc
28a50 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20 2b  ;.        pBuf +
28a60 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = a;.      }.   
28a70 20 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61     if( rc ) brea
28a80 6b 3b 0a 20 20 20 20 20 20 69 49 64 78 2b 2b 3b  k;.      iIdx++;
28a90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
28aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
28ab0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
28ac0 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 63 68 61 69  /* Overflow chai
28ad0 6e 20 65 6e 64 73 20 70 72 65 6d 61 74 75 72 65  n ends premature
28ae0 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
28af0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28b00 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 7d  PAGE(pPage);.  }
28b10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28b20 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
28b30 20 6f 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   of the payload 
28b40 66 6f 72 20 74 68 65 20 72 6f 77 20 61 74 20 77  for the row at w
28b50 68 69 63 68 20 74 68 61 74 20 63 75 72 73 6f 72  hich that cursor
28b60 20 70 43 75 72 20 69 73 20 63 75 72 72 65 6e 74   pCur is current
28b70 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20  ly.** pointing. 
28b80 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
28b90 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  l be transferred
28ba0 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
28bb0 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
28bc0 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
28bd0 22 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61  "..**.** pCur ca
28be0 6e 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  n be pointing to
28bf0 20 65 69 74 68 65 72 20 61 20 74 61 62 6c 65 20   either a table 
28c00 6f 72 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72  or an index b-tr
28c10 65 65 2e 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69  ee..** If pointi
28c20 6e 67 20 74 6f 20 61 20 74 61 62 6c 65 20 62 74  ng to a table bt
28c30 72 65 65 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ree, then the co
28c40 6e 74 65 6e 74 20 73 65 63 74 69 6f 6e 20 69 73  ntent section is
28c50 20 72 65 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43   read.  If.** pC
28c60 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  ur is pointing t
28c70 6f 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  o an index b-tre
28c80 65 20 74 68 65 6e 20 74 68 65 20 6b 65 79 20 73  e then the key s
28c90 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a  ection is read..
28ca0 2a 2a 0a 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65  **.** For sqlite
28cb0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 29 2c  3BtreePayload(),
28cc0 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
28cd0 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
28ce0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a  r is pointing.**
28cf0 20 74 6f 20 61 20 76 61 6c 69 64 20 72 6f 77 20   to a valid row 
28d00 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 46  in the table.  F
28d10 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  or sqlite3BtreeP
28d20 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 29 2c  ayloadChecked(),
28d30 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d   the.** cursor m
28d40 69 67 68 74 20 62 65 20 69 6e 76 61 6c 69 64 20  ight be invalid 
28d50 6f 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f  or might need to
28d60 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 65 66   be restored bef
28d70 6f 72 65 20 62 65 69 6e 67 20 72 65 61 64 2e 0a  ore being read..
28d80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
28d90 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
28da0 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
28db0 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
28dc0 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
28dd0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
28de0 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
28df0 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
28e00 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
28e10 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
28e20 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
28e30 50 61 79 6c 6f 61 64 28 42 74 43 75 72 73 6f 72  Payload(BtCursor
28e40 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73   *pCur, u32 offs
28e50 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69  et, u32 amt, voi
28e60 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73 73 65  d *pBuf){.  asse
28e70 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28e80 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28e90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28ea0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
28eb0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
28ec0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26  pCur->iPage>=0 &
28ed0 26 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  & pCur->pPage );
28ee0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28ef0 3e 69 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d  >ix<pCur->pPage-
28f00 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
28f10 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
28f20 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
28f30 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
28f40 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
28f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 61 72 69  ./*.** This vari
28f60 61 6e 74 20 6f 66 20 73 71 6c 69 74 65 33 42 74  ant of sqlite3Bt
28f70 72 65 65 50 61 79 6c 6f 61 64 28 29 20 77 6f 72  reePayload() wor
28f80 6b 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 63  ks even if the c
28f90 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 0a 2a 2a  ursor has not.**
28fa0 20 69 6e 20 74 68 65 20 43 55 52 53 4f 52 5f 56   in the CURSOR_V
28fb0 41 4c 49 44 20 73 74 61 74 65 2e 20 20 49 74 20  ALID state.  It 
28fc0 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20  is only used by 
28fd0 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
28fe0 5f 72 65 61 64 28 29 0a 2a 2a 20 69 6e 74 65 72  _read().** inter
28ff0 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  face..*/.#ifndef
29000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
29010 52 42 4c 4f 42 0a 73 74 61 74 69 63 20 53 51 4c  RBLOB.static SQL
29020 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
29030 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 43 68   accessPayloadCh
29040 65 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f  ecked(.  BtCurso
29050 72 20 2a 70 43 75 72 2c 0a 20 20 75 33 32 20 6f  r *pCur,.  u32 o
29060 66 66 73 65 74 2c 0a 20 20 75 33 32 20 61 6d 74  ffset,.  u32 amt
29070 2c 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 0a 29  ,.  void *pBuf.)
29080 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
29090 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
290a0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
290b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
290c0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
290d0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
290e0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
290f0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 62 74 72  r) );.  rc = btr
29100 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72 50  eeRestoreCursorP
29110 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
29120 20 72 65 74 75 72 6e 20 72 63 20 3f 20 72 63 20   return rc ? rc 
29130 3a 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  : accessPayload(
29140 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
29150 74 2c 20 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 69  t, pBuf, 0);.}.i
29160 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
29170 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74  ayloadChecked(Bt
29180 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
29190 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
291a0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
291b0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
291c0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
291d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
291e0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
291f0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 20 20  ed(pCur) );.    
29200 72 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79  return accessPay
29210 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
29220 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29  t, amt, pBuf, 0)
29230 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
29240 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
29250 6f 61 64 43 68 65 63 6b 65 64 28 70 43 75 72 2c  oadChecked(pCur,
29260 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
29270 75 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  uf);.  }.}.#endi
29280 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
29290 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
292a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
292b0 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
292c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
292d0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
292e0 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
292f0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
29300 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
29310 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
29320 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
29330 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65  ey if index btre
29340 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
29350 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65  y==0) and is the
29360 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62   data for.** tab
29370 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65  le btrees (pPage
29380 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68  ->intKey==1). Th
29390 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
293a0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a  s of available.*
293b0 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  * key/data is wr
293c0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74  itten into *pAmt
293d0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
293e0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a  then the value.*
293f0 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  * returned will 
29400 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70  not be a valid p
29410 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
29420 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
29430 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
29440 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
29450 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
29460 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
29470 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
29480 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
29490 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
294a0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
294b0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
294c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
294d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
294e0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
294f0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
29500 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
29510 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
29520 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
29530 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
29540 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
29550 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
29560 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
29570 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
29580 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
29590 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
295a0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
295b0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
295c0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
295d0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
295e0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
295f0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
29600 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
29610 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
29620 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
29630 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
29640 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
29650 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
29660 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f  .static const vo
29670 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  id *fetchPayload
29680 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
29690 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
296a0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
296b0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
296c0 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74  m */.  u32 *pAmt
296d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
296e0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
296f0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
29700 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  es here */.){.  
29710 69 6e 74 20 61 6d 74 3b 0a 20 20 61 73 73 65 72  int amt;.  asser
29720 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
29730 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
29740 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
29750 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
29760 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
29770 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
29780 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29790 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
297a0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
297b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
297c0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
297d0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
297e0 43 75 72 2d 3e 69 78 3c 70 43 75 72 2d 3e 70 50  Cur->ix<pCur->pP
297f0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
29800 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
29810 66 6f 2e 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20  fo.nSize>0 );.  
29820 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
29830 66 6f 2e 70 50 61 79 6c 6f 61 64 3e 70 43 75 72  fo.pPayload>pCur
29840 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  ->pPage->aData |
29850 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
29860 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29870 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3c 70 43  info.pPayload<pC
29880 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61  ur->pPage->aData
29890 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44 42  End ||CORRUPT_DB
298a0 29 3b 0a 20 20 61 6d 74 20 3d 20 70 43 75 72 2d  );.  amt = pCur-
298b0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20  >info.nLocal;.  
298c0 69 66 28 20 61 6d 74 3e 28 69 6e 74 29 28 70 43  if( amt>(int)(pC
298d0 75 72 2d 3e 70 50 61 67 65 2d 3e 61 44 61 74 61  ur->pPage->aData
298e0 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f  End - pCur->info
298f0 2e 70 50 61 79 6c 6f 61 64 29 20 29 7b 0a 20 20  .pPayload) ){.  
29900 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 74 6f    /* There is to
29910 6f 20 6c 69 74 74 6c 65 20 73 70 61 63 65 20 6f  o little space o
29920 6e 20 74 68 65 20 70 61 67 65 20 66 6f 72 20 74  n the page for t
29930 68 65 20 65 78 70 65 63 74 65 64 20 61 6d 6f 75  he expected amou
29940 6e 74 0a 20 20 20 20 2a 2a 20 6f 66 20 6c 6f 63  nt.    ** of loc
29950 61 6c 20 63 6f 6e 74 65 6e 74 2e 20 44 61 74 61  al content. Data
29960 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72  base must be cor
29970 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  rupt. */.    ass
29980 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
29990 29 3b 0a 20 20 20 20 61 6d 74 20 3d 20 4d 41 58  );.    amt = MAX
299a0 28 30 2c 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  (0, (int)(pCur->
299b0 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
299c0 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61  - pCur->info.pPa
299d0 79 6c 6f 61 64 29 29 3b 0a 20 20 7d 0a 20 20 2a  yload));.  }.  *
299e0 70 41 6d 74 20 3d 20 28 75 33 32 29 61 6d 74 3b  pAmt = (u32)amt;
299f0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
29a00 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79  )pCur->info.pPay
29a10 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  load;.}.../*.** 
29a20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  For the entry th
29a30 61 74 20 63 75 72 73 6f 72 20 70 43 75 72 20 69  at cursor pCur i
29a40 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75  s point to, retu
29a50 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79  rn as.** many by
29a60 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  tes of the key o
29a70 72 20 64 61 74 61 20 61 73 20 61 72 65 20 61 76  r data as are av
29a80 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c  ailable on the l
29a90 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70  ocal.** b-tree p
29aa0 61 67 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  age.  Write the 
29ab0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
29ac0 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a  ble bytes into *
29ad0 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pAmt..**.** The 
29ae0 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
29af0 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20   is ephemeral.  
29b00 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79  The key/data may
29b10 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64   move.** or be d
29b20 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20  estroyed on the 
29b30 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79  next call to any
29b40 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a   Btree routine,.
29b50 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c  ** including cal
29b60 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68  ls from other th
29b70 72 65 61 64 73 20 61 67 61 69 6e 73 74 20 74 68  reads against th
29b80 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a  e same cache..**
29b90 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20   Hence, a mutex 
29ba0 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 20  on the BtShared 
29bb0 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70  should be held p
29bc0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a  rior to calling.
29bd0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ** this routine.
29be0 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75  .**.** These rou
29bf0 74 69 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f  tines is used to
29c00 20 67 65 74 20 71 75 69 63 6b 20 61 63 63 65 73   get quick acces
29c10 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74  s to key and dat
29c20 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d  a.** in the comm
29c30 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f  on case where no
29c40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
29c50 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e  are used..*/.con
29c60 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  st void *sqlite3
29c70 42 74 72 65 65 50 61 79 6c 6f 61 64 46 65 74 63  BtreePayloadFetc
29c80 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
29c90 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
29ca0 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
29cb0 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
29cc0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
29cd0 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20  the cursor down 
29ce0 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
29cf0 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e  age.  The newPgn
29d00 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  o argument is th
29d10 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72  e.** page number
29d20 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
29d30 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a  ge to move to..*
29d40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
29d50 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  on returns SQLIT
29d60 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74 68 65  E_CORRUPT if the
29d70 20 70 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61   page-header fla
29d80 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a 20 74  gs field of.** t
29d90 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
29da0 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
29db0 20 74 68 65 20 66 6c 61 67 73 20 66 69 65 6c 64   the flags field
29dc0 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 28   of the parent (
29dd0 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20 69 6e  i.e..** if an in
29de0 74 6b 65 79 20 70 61 67 65 20 61 70 70 65 61 72  tkey page appear
29df0 73 20 74 6f 20 62 65 20 74 68 65 20 70 61 72 65  s to be the pare
29e00 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e 74 6b  nt of a non-intk
29e10 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a 20 76  ey page, or.** v
29e20 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f 0a 73  ice-versa)..*/.s
29e30 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29e40 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
29e50 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
29e60 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  o){.  BtShared *
29e70 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
29e80 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29e90 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
29ea0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29eb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29ec0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29ed0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29ee0 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d  iPage<BTCURSOR_M
29ef0 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73  AX_DEPTH );.  as
29f00 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
29f10 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e>=0 );.  if( pC
29f20 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43 55  ur->iPage>=(BTCU
29f30 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d 31  RSOR_MAX_DEPTH-1
29f40 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
29f50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29f60 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  KPT;.  }.  pCur-
29f70 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
29f80 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
29f90 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
29fa0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
29fb0 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e 61  Ovfl);.  pCur->a
29fc0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29fd0 5d 20 3d 20 70 43 75 72 2d 3e 69 78 3b 0a 20 20  ] = pCur->ix;.  
29fe0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29ff0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 43 75 72  r->iPage] = pCur
2a000 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43 75 72 2d  ->pPage;.  pCur-
2a010 3e 69 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  >ix = 0;.  pCur-
2a020 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 72 65 74 75  >iPage++;.  retu
2a030 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  rn getAndInitPag
2a040 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
2a050 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  &pCur->pPage, pC
2a060 75 72 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ur, pCur->curPag
2a070 65 72 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66  erFlags);.}..#if
2a080 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2a090 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50 61 72  ./*.** Page pPar
2a0a0 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  ent is an intern
2a0b0 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20 74 72  al (non-leaf) tr
2a0c0 65 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  ee page. This fu
2a0d0 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73 65 72  nction .** asser
2a0e0 74 73 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d  ts that page num
2a0f0 62 65 72 20 69 43 68 69 6c 64 20 69 73 20 74 68  ber iChild is th
2a100 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69 66 20  e left-child if 
2a110 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a 20 63  the iIdx'th.** c
2a120 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50 61 72  ell in page pPar
2a130 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49 64 78  ent. Or, if iIdx
2a140 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74 68 65   is equal to the
2a150 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
2a160 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  .** cells in pPa
2a170 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67 65 20  rent, that page 
2a180 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
2a190 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
2a1a0 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 2e   of.** the page.
2a1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a1c0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
2a1d0 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65  x(MemPage *pPare
2a1e0 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20 50 67  nt, int iIdx, Pg
2a1f0 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20 69 66  no iChild){.  if
2a200 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72  ( CORRUPT_DB ) r
2a210 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
2a220 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74 65 64  onditions tested
2a230 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e 6f 74   below might not
2a240 20 62 65 20 74 72 75 65 0a 20 20 20 20 20 20 20   be true.       
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63 6f 72       ** in a cor
2a270 72 75 70 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rupt database */
2a280 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
2a290 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
2a2a0 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
2a2b0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
2a2c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2a2d0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
2a2e0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
2a2f0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
2a300 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
2a310 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
2a320 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2a330 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
2a340 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
2a350 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
2a360 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
2a370 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
2a380 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
2a390 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
2a3a0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
2a3b0 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
2a3c0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
2a3d0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
2a3e0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
2a3f0 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
2a400 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
2a410 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
2a420 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
2a430 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
2a440 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
2a450 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
2a460 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
2a470 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
2a480 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74  ell index..*/.st
2a490 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65 54 6f  atic void moveTo
2a4a0 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
2a4b0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
2a4c0 65 20 2a 70 4c 65 61 66 3b 0a 20 20 61 73 73 65  e *pLeaf;.  asse
2a4d0 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2a4e0 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2a4f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a500 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2a510 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2a520 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  ( pCur->iPage>0 
2a530 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2a540 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61 73  r->pPage );.  as
2a550 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
2a560 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
2a570 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
2a580 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
2a590 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
2a5a0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  ], .    pCur->pP
2a5b0 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20  age->pgno.  );. 
2a5c0 20 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d   testcase( pCur-
2a5d0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2a5e0 67 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70  ge-1] > pCur->ap
2a5f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a600 2d 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  -1]->nCell );.  
2a610 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2a620 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75   = 0;.  pCur->cu
2a630 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46  rFlags &= ~(BTCF
2a640 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f  _ValidNKey|BTCF_
2a650 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43  ValidOvfl);.  pC
2a660 75 72 2d 3e 69 78 20 3d 20 70 43 75 72 2d 3e 61  ur->ix = pCur->a
2a670 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2a680 2d 31 5d 3b 0a 20 20 70 4c 65 61 66 20 3d 20 70  -1];.  pLeaf = p
2a690 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 43  Cur->pPage;.  pC
2a6a0 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 43 75 72  ur->pPage = pCur
2a6b0 2d 3e 61 70 50 61 67 65 5b 2d 2d 70 43 75 72 2d  ->apPage[--pCur-
2a6c0 3e 69 50 61 67 65 5d 3b 0a 20 20 72 65 6c 65 61  >iPage];.  relea
2a6d0 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 4c  sePageNotNull(pL
2a6e0 65 61 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  eaf);.}../*.** M
2a6f0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
2a700 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72  o point to the r
2a710 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 74 73 20  oot page of its 
2a720 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65  b-tree structure
2a730 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74  ..**.** If the t
2a740 61 62 6c 65 20 68 61 73 20 61 20 76 69 72 74 75  able has a virtu
2a750 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68  al root page, th
2a760 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2a770 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a   moved to point.
2a780 2a 2a 20 74 6f 20 74 68 65 20 76 69 72 74 75 61  ** to the virtua
2a790 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74  l root page inst
2a7a0 65 61 64 20 6f 66 20 74 68 65 20 61 63 74 75 61  ead of the actua
2a7b0 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74  l root page. A t
2a7c0 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69  able has a.** vi
2a7d0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  rtual root page 
2a7e0 77 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20  when the actual 
2a7f0 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69  root page contai
2a800 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20  ns no cells and 
2a810 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69  a .** single chi
2a820 6c 64 20 70 61 67 65 2e 20 54 68 69 73 20 63 61  ld page. This ca
2a830 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69  n only happen wi
2a840 74 68 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  th the table roo
2a850 74 65 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a  ted at page 1..*
2a860 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72  *.** If the b-tr
2a870 65 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ee structure is 
2a880 65 6d 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f  empty, the curso
2a890 72 20 73 74 61 74 65 20 69 73 20 73 65 74 20 74  r state is set t
2a8a0 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56  o .** CURSOR_INV
2a8b0 41 4c 49 44 20 61 6e 64 20 74 68 69 73 20 72 6f  ALID and this ro
2a8c0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
2a8d0 4c 49 54 45 5f 45 4d 50 54 59 2e 20 4f 74 68 65  LITE_EMPTY. Othe
2a8e0 72 77 69 73 65 2c 0a 2a 2a 20 74 68 65 20 63 75  rwise,.** the cu
2a8f0 72 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70  rsor is set to p
2a900 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73  oint to the firs
2a910 74 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  t cell located o
2a920 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 28 6f  n the root.** (o
2a930 72 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20  r virtual root) 
2a940 70 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72  page and the cur
2a950 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65 74  sor state is set
2a960 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
2a970 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
2a980 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
2a990 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
2a9a0 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
2a9b0 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
2a9c0 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
2a9d0 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
2a9e0 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
2a9f0 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
2aa00 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
2aa10 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
2aa20 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
2aa30 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
2aa40 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
2aa50 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
2aa60 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
2aa70 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
2aa80 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
2aa90 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
2aaa0 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
2aab0 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
2aac0 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
2aad0 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
2aae0 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
2aaf0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
2ab00 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
2ab10 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
2ab20 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
2ab30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
2ab40 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
2ab50 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2ab60 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
2ab70 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2ab80 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
2ab90 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2aba0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2abb0 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
2abc0 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
2abd0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
2abe0 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
2abf0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
2ac00 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
2ac10 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
2ac20 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
2ac30 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
2ac40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2ac50 61 74 65 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  ate < CURSOR_REQ
2ac60 55 49 52 45 53 45 45 4b 20 7c 7c 20 70 43 75 72  UIRESEEK || pCur
2ac70 2d 3e 69 50 61 67 65 3c 30 20 29 3b 0a 20 20 61  ->iPage<0 );.  a
2ac80 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2ac90 6f 52 6f 6f 74 3e 30 20 7c 7c 20 70 43 75 72 2d  oRoot>0 || pCur-
2aca0 3e 69 50 61 67 65 3c 30 20 29 3b 0a 0a 20 20 69  >iPage<0 );..  i
2acb0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  f( pCur->iPage>=
2acc0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  0 ){.    if( pCu
2acd0 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20  r->iPage ){.    
2ace0 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
2acf0 4e 75 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Null(pCur->pPage
2ad00 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
2ad10 2d 2d 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b  --pCur->iPage ){
2ad20 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
2ad30 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
2ad40 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2ad50 50 61 67 65 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Page]);.      }.
2ad60 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67        pCur->pPag
2ad70 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2ad80 5b 30 5d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  [0];.      goto 
2ad90 73 6b 69 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d  skip_init;.    }
2ada0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75  .  }else if( pCu
2adb0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29  r->pgnoRoot==0 )
2adc0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
2add0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
2ade0 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LID;.    return 
2adf0 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20  SQLITE_EMPTY;.  
2ae00 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
2ae10 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  t( pCur->iPage==
2ae20 28 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  (-1) );.    if( 
2ae30 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
2ae40 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
2ae50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43   ){.      if( pC
2ae60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ae70 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2ae80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2ae90 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
2aea0 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20  TE_OK );.       
2aeb0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2aec0 69 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  ipNext;.      }.
2aed0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
2aee0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43  eeClearCursor(pC
2aef0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ur);.    }.    r
2af00 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
2af10 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ge(pCur->pBtree-
2af20 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  >pBt, pCur->pgno
2af30 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61  Root, &pCur->pPa
2af40 67 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge,.            
2af50 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70              0, p
2af60 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61  Cur->curPagerFla
2af70 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  gs);.    if( rc!
2af80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2af90 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2afa0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2afb0 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
2afc0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43  rc;.    }.    pC
2afd0 75 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20  ur->iPage = 0;. 
2afe0 20 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b     pCur->curIntK
2aff0 65 79 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ey = pCur->pPage
2b000 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
2b010 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50  pRoot = pCur->pP
2b020 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
2b030 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
2b040 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
2b050 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
2b060 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
2b070 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
2b080 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
2b090 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
2b0a0 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
2b0b0 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
2b0c0 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
2b0d0 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
2b0e0 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
2b0f0 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
2b100 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
2b110 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2b120 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
2b130 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
2b140 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
2b150 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
2b160 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
2b170 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
2b180 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
2b190 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
2b1a0 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
2b1b0 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
2b1c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
2b1d0 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
2b1e0 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
2b1f0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
2b200 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
2b210 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
2b220 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
2b230 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
2b240 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
2b250 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
2b260 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
2b270 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
2b280 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
2b290 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2b2a0 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
2b2b0 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
2b2c0 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
2b2d0 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
2b2e0 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
2b2f0 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
2b300 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
2b310 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2b320 54 5f 50 41 47 45 28 70 43 75 72 2d 3e 70 50 61  T_PAGE(pCur->pPa
2b330 67 65 29 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69  ge);.  }..skip_i
2b340 6e 69 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 69  nit:  .  pCur->i
2b350 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69  x = 0;.  pCur->i
2b360 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2b370 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2b380 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74  &= ~(BTCF_AtLast
2b390 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  |BTCF_ValidNKey|
2b3a0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
2b3b0 0a 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  ..  pRoot = pCur
2b3c0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
2b3d0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b  Root->nCell>0 ){
2b3e0 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2b3f0 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2b400 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70  ;.  }else if( !p
2b410 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
2b420 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
2b430 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 70      if( pRoot->p
2b440 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e 20  gno!=1 ) return 
2b450 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b460 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67 65  KPT;.    subpage
2b470 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52 6f   = get4byte(&pRo
2b480 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d  ot->aData[pRoot-
2b490 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2b4a0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2b4b0 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
2b4c0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2b4d0 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70  Child(pCur, subp
2b4e0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  age);.  }else{. 
2b4f0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
2b500 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
2b510 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2b520 45 5f 45 4d 50 54 59 3b 0a 20 20 7d 0a 20 20 72  E_EMPTY;.  }.  r
2b530 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b540 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
2b550 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
2b560 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
2b570 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
2b580 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
2b590 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
2b5a0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
2b5b0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
2b5c0 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
2b5d0 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
2b5e0 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
2b5f0 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
2b600 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2b610 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
2b620 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
2b630 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
2b640 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
2b650 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
2b660 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
2b670 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2b680 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2b690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b6a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b6b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
2b6c0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
2b6d0 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
2b6e0 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
2b6f0 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
2b700 20 70 43 75 72 2d 3e 69 78 3c 70 50 61 67 65 2d   pCur->ix<pPage-
2b710 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67  >nCell );.    pg
2b720 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69  no = get4byte(fi
2b730 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  ndCell(pPage, pC
2b740 75 72 2d 3e 69 78 29 29 3b 0a 20 20 20 20 72 63  ur->ix));.    rc
2b750 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2b760 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
2b770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b780 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
2b790 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
2b7a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
2b7b0 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
2b7c0 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
2b7d0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
2b7e0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
2b7f0 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
2b800 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
2b810 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
2b820 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
2b830 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
2b840 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
2b850 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
2b860 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
2b870 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
2b880 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
2b890 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
2b8a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
2b8b0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
2b8c0 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
2b8d0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
2b8e0 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
2b8f0 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
2b900 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
2b910 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
2b920 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
2b930 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
2b940 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
2b950 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
2b960 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
2b970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
2b980 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
2b990 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2b9a0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2b9b0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2b9c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b9d0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2b9e0 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65    while( !(pPage
2b9f0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
2ba00 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e  >leaf ){.    pgn
2ba10 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
2ba20 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2ba30 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2ba40 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20  .    pCur->ix = 
2ba50 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
2ba60 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2ba70 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
2ba80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2ba90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
2baa0 75 72 2d 3e 69 78 20 3d 20 70 50 61 67 65 2d 3e  ur->ix = pPage->
2bab0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72  nCell-1;.  asser
2bac0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2bad0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ize==0 );.  asse
2bae0 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2baf0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2bb00 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65  NKey)==0 );.  re
2bb10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2bb20 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
2bb30 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72  ursor to the fir
2bb40 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2bb50 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2bb60 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2bb70 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2bb80 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2bb90 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2bba0 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2bbb0 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2bbc0 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2bbd0 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2bbe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2bbf0 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72  eeFirst(BtCursor
2bc00 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2bc10 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  s){.  int rc;.. 
2bc20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2bc30 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2bc40 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2bc50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2bc60 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2bc70 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
2bc80 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2bc90 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
2bca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bcb0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2bcc0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2bcd0 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
2bce0 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2bcf0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
2bd00 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
2bd10 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 29 7b 0a  SQLITE_EMPTY ){.
2bd20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2bd30 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2bd40 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
2bd50 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 2a 70  ell==0 );.    *p
2bd60 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 63 20  Res = 1;.    rc 
2bd70 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
2bd80 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2bd90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2bda0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tion is a no-op 
2bdb0 69 66 20 63 75 72 73 6f 72 20 70 43 75 72 20 64  if cursor pCur d
2bdc0 6f 65 73 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f  oes not point to
2bdd0 20 61 20 76 61 6c 69 64 20 72 6f 77 2e 0a 2a 2a   a valid row..**
2bde0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
2bdf0 43 75 72 20 69 73 20 76 61 6c 69 64 2c 20 63 6f  Cur is valid, co
2be00 6e 66 69 67 75 72 65 20 69 74 20 73 6f 20 74 68  nfigure it so th
2be10 61 74 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  at the next call
2be20 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   to.** sqlite3Bt
2be30 72 65 65 4e 65 78 74 28 29 20 69 73 20 61 20 6e  reeNext() is a n
2be40 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  o-op..*/.#ifndef
2be50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
2be60 44 4f 57 46 55 4e 43 0a 76 6f 69 64 20 73 71 6c  DOWFUNC.void sql
2be70 69 74 65 33 42 74 72 65 65 53 6b 69 70 4e 65 78  ite3BtreeSkipNex
2be80 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
2be90 29 7b 0a 20 20 2f 2a 20 57 65 20 62 65 6c 69 65  ){.  /* We belie
2bea0 76 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ve that the curs
2beb0 6f 72 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  or must always b
2bec0 65 20 69 6e 20 74 68 65 20 76 61 6c 69 64 20 73  e in the valid s
2bed0 74 61 74 65 20 77 68 65 6e 0a 20 20 2a 2a 20 74  tate when.  ** t
2bee0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
2bef0 61 6c 6c 65 64 2c 20 62 75 74 20 74 68 65 20 70  alled, but the p
2bf00 72 6f 6f 66 20 69 73 20 64 69 66 66 69 63 75 6c  roof is difficul
2bf10 74 2c 20 73 6f 20 77 65 20 61 64 64 20 61 6e 0a  t, so we add an.
2bf20 20 20 2a 2a 20 41 4c 57 61 59 53 28 29 20 74 65    ** ALWaYS() te
2bf30 73 74 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20  st just in case 
2bf40 77 65 20 61 72 65 20 77 72 6f 6e 67 2e 20 2a 2f  we are wrong. */
2bf50 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43  .  if( ALWAYS(pC
2bf60 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2bf70 4f 52 5f 56 41 4c 49 44 29 20 29 7b 0a 20 20 20  OR_VALID) ){.   
2bf80 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2bf90 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3b  CURSOR_SKIPNEXT;
2bfa0 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e  .    pCur->skipN
2bfb0 65 78 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23  ext = 1;.  }.}.#
2bfc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2bfd0 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
2bfe0 2a 2f 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  */../* Move the 
2bff0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61  cursor to the la
2c000 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2c010 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53  table.  Return S
2c020 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
2c030 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52  uccess.  Set *pR
2c040 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63  es to 0 if the c
2c050 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70  ursor actually p
2c060 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69  oints to somethi
2c070 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52  ng.** or set *pR
2c080 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74  es to 1 if the t
2c090 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2c0a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2c0b0 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20  eeLast(BtCursor 
2c0c0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2c0d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20  ){.  int rc;. . 
2c0e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
2c0f0 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
2c100 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
2c110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2c120 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
2c130 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  db->mutex) );.. 
2c140 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f   /* If the curso
2c150 72 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73  r already points
2c160 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2c170 72 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ry, this is a no
2c180 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55  -op. */.  if( CU
2c190 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2c1a0 2d 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75  ->eState && (pCu
2c1b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2c1c0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b  CF_AtLast)!=0 ){
2c1d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2c1e0 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73  EBUG.    /* This
2c1f0 20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f   block serves to
2c200 20 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74   assert() that t
2c210 68 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79  he cursor really
2c220 20 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20   does point .   
2c230 20 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20   ** to the last 
2c240 65 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74  entry in the b-t
2c250 72 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ree. */.    int 
2c260 69 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  ii;.    for(ii=0
2c270 3b 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65  ; ii<pCur->iPage
2c280 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
2c290 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
2c2a0 64 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70  dx[ii]==pCur->ap
2c2b0 50 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20  Page[ii]->nCell 
2c2c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2c2d0 65 72 74 28 20 70 43 75 72 2d 3e 69 78 3d 3d 70  ert( pCur->ix==p
2c2e0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
2c2f0 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l-1 );.    asser
2c300 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
2c310 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20  leaf );.#endif. 
2c320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c330 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
2c340 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2c350 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2c360 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c370 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2c380 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
2c390 20 29 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   );.    *pRes = 
2c3a0 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  0;.    rc = move
2c3b0 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72  ToRightmost(pCur
2c3c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c3d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c3e0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c3f0 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b   |= BTCF_AtLast;
2c400 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2c410 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
2c420 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74   &= ~BTCF_AtLast
2c430 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2c440 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  if( rc==SQLITE_E
2c450 4d 50 54 59 20 29 7b 0a 20 20 20 20 61 73 73 65  MPTY ){.    asse
2c460 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2c470 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 70  ot==0 || pCur->p
2c480 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
2c490 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  ;.    *pRes = 1;
2c4a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2c4b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
2c4c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2c4d0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
2c4e0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2c4f0 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
2c500 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
2c510 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
2c520 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
2c530 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
2c540 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
2c550 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
2c560 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
2c570 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
2c580 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
2c590 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
2c5a0 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
2c5b0 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
2c5c0 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
2c5d0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2c5e0 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
2c5f0 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
2c600 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
2c610 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
2c620 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
2c630 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
2c640 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
2c650 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
2c660 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
2c670 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2c680 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
2c690 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
2c6a0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
2c6b0 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
2c6c0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2c6d0 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
2c6e0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2c6f0 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
2c700 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
2c710 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
2c720 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
2c730 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
2c740 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
2c750 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
2c760 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
2c770 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2c780 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
2c790 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2c7a0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2c7b0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7d0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
2c7e0 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
2c7f0 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
2c800 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
2c810 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
2c820 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
2c830 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
2c840 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
2c850 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
2c860 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
2c870 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2c880 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2c890 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2c8a0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
2c8b0 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
2c8c0 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
2c8d0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
2c8e0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2c8f0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2c900 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2c910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2c920 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
2c930 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2c940 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61  .** For index ta
2c950 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65  bles, the pIdxKe
2c960 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20  y->eqSeen field 
2c970 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  is set to 1 if t
2c980 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61  here.** exists a
2c990 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
2c9a0 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c  able that exactl
2c9b0 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65  y matches pIdxKe
2c9c0 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
2c9d0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2c9e0 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
2c9f0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2ca00 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2ca10 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
2ca20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2ca30 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
2ca40 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2ca50 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
2ca60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ca70 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
2ca80 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
2ca90 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2caa0 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
2cab0 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
2cac0 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
2cad0 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
2cae0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2caf0 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
2cb00 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2cb10 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
2cb20 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
2cb30 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
2cb40 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2cb50 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2cb60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2cb70 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2cb80 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2cb90 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2cba0 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
2cbb0 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
2cbc0 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2cbd0 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
2cbe0 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2cbf0 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 28 70  RSOR_VALID || (p
2cc00 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75  IdxKey==0)==(pCu
2cc10 72 2d 3e 63 75 72 49 6e 74 4b 65 79 21 3d 30 29  r->curIntKey!=0)
2cc20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2cc30 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2cc40 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
2cc50 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
2cc60 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
2cc70 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
2cc80 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
2cc90 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
2cca0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 49 64 78 4b  k */.  if( pIdxK
2ccb0 65 79 3d 3d 30 0a 20 20 20 26 26 20 70 43 75 72  ey==0.   && pCur
2ccc0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ccd0 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
2cce0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ccf0 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
2cd00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2cd10 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74  ->info.nKey==int
2cd20 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
2cd30 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
2cd40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2cd50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
2cd60 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e  ur->info.nKey<in
2cd70 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 69 66  tKey ){.      if
2cd80 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2cd90 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29  s & BTCF_AtLast)
2cda0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  !=0 ){.        *
2cdb0 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2cdc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cdd0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2cde0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 71     /* If the req
2cdf0 75 65 73 74 65 64 20 6b 65 79 20 69 73 20 6f 6e  uested key is on
2ce00 65 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 65 20  e more than the 
2ce10 70 72 65 76 69 6f 75 73 20 6b 65 79 2c 20 74 68  previous key, th
2ce20 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 72 79 20  en.      ** try 
2ce30 74 6f 20 67 65 74 20 74 68 65 72 65 20 75 73 69  to get there usi
2ce40 6e 67 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  ng sqlite3BtreeN
2ce50 65 78 74 28 29 20 72 61 74 68 65 72 20 74 68 61  ext() rather tha
2ce60 6e 20 61 20 66 75 6c 6c 0a 20 20 20 20 20 20 2a  n a full.      *
2ce70 2a 20 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e  * binary search.
2ce80 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74    This is an opt
2ce90 69 6d 69 7a 61 74 69 6f 6e 20 6f 6e 6c 79 2e 20  imization only. 
2cea0 20 54 68 65 20 63 6f 72 72 65 63 74 20 61 6e 73   The correct ans
2ceb0 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  wer.      ** is 
2cec0 73 74 69 6c 6c 20 6f 62 74 61 69 6e 65 64 20 77  still obtained w
2ced0 69 74 68 6f 75 74 20 74 68 69 73 20 63 61 73 65  ithout this case
2cee0 2c 20 6f 6e 6c 79 20 61 20 6c 69 74 74 6c 65 20  , only a little 
2cef0 6d 6f 72 65 20 73 6c 6f 77 65 6c 79 20 2a 2f 0a  more slowely */.
2cf00 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2cf10 69 6e 66 6f 2e 6e 4b 65 79 2b 31 3d 3d 69 6e 74  info.nKey+1==int
2cf20 4b 65 79 20 26 26 20 21 70 43 75 72 2d 3e 73 6b  Key && !pCur->sk
2cf30 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2cf40 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2cf50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2cf60 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
2cf70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2cf80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2cf90 7b 0a 20 20 20 20 20 20 20 20 20 20 67 65 74 43  {.          getC
2cfa0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
2cfb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75           if( pCu
2cfc0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e  r->info.nKey==in
2cfd0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2cfe0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cff0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
2d000 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
2d010 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
2d020 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
2d030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2d040 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2d050 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d060 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2d070 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2d080 0a 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 20  ..  if( pIdxKey 
2d090 29 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f  ){.    xRecordCo
2d0a0 6d 70 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56  mpare = sqlite3V
2d0b0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70  dbeFindCompare(p
2d0c0 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64  IdxKey);.    pId
2d0d0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20  xKey->errCode = 
2d0e0 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  0;.    assert( p
2d0f0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2d100 72 63 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20  rc==1 .         
2d110 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2d120 75 6c 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20  ult_rc==0 .     
2d130 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e      || pIdxKey->
2d140 64 65 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20  default_rc==-1. 
2d150 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20     );.  }else{. 
2d160 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2d170 65 20 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65  e = 0; /* All ke
2d180 79 73 20 61 72 65 20 69 6e 74 65 67 65 72 73 20  ys are integers 
2d190 2a 2f 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d  */.  }..  rc = m
2d1a0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2d1b0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
2d1c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2d1d0 45 4d 50 54 59 20 29 7b 0a 20 20 20 20 20 20 61  EMPTY ){.      a
2d1e0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2d1f0 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2d200 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
2d210 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
2d220 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
2d230 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d240 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
2d250 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2d260 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29 3b  ( pCur->pPage );
2d270 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2d280 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  >pPage->isInit )
2d290 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d2a0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2d2b0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2d2c0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d  rt( pCur->pPage-
2d2d0 3e 6e 43 65 6c 6c 20 3e 20 30 20 29 3b 0a 20 20  >nCell > 0 );.  
2d2e0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2d2f0 61 67 65 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  age==0 || pCur->
2d300 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2d310 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y==pCur->curIntK
2d320 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2d330 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2d340 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
2d350 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
2d360 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
2d370 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
2d380 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
2d390 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
2d3a0 50 61 67 65 3b 0a 20 20 20 20 75 38 20 2a 70 43  Page;.    u8 *pC
2d3b0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2d3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d3d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
2d3e0 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67  ent cell in pPag
2d3f0 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61  e */..    /* pPa
2d400 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62  ge->nCell must b
2d410 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  e greater than z
2d420 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20  ero. If this is 
2d430 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  the root-page.  
2d440 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20    ** the cursor 
2d450 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  would have been 
2d460 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e  INVALID above an
2d470 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c  d this for(;;) l
2d480 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72  oop.    ** not r
2d490 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  un. If this is n
2d4a0 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  ot the root-page
2d4b0 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54  , then the moveT
2d4c0 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65  oChild() routine
2d4d0 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61  .    ** would ha
2d4e0 76 65 20 61 6c 72 65 61 64 79 20 64 65 74 65 63  ve already detec
2d4f0 74 65 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f  ted db corruptio
2d500 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50  n. Similarly, pP
2d510 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  age must.    ** 
2d520 62 65 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e  be the right kin
2d530 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  d (index or tabl
2d540 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67  e) of b-tree pag
2d550 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20  e. Otherwise.   
2d560 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c   ** a moveToChil
2d570 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f  d() or moveToRoo
2d580 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68  t() call would h
2d590 61 76 65 20 64 65 74 65 63 74 65 64 20 63 6f 72  ave detected cor
2d5a0 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
2d5b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2d5c0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61  nCell>0 );.    a
2d5d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
2d5e0 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d  tKey==(pIdxKey==
2d5f0 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20  0) );.    lwr = 
2d600 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
2d610 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
2d620 20 61 73 73 65 72 74 28 20 62 69 61 73 52 69 67   assert( biasRig
2d630 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67  ht==0 || biasRig
2d640 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78  ht==1 );.    idx
2d650 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52   = upr>>(1-biasR
2d660 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20  ight); /* idx = 
2d670 62 69 61 73 52 69 67 68 74 20 3f 20 75 70 72 20  biasRight ? upr 
2d680 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a  : (lwr+upr)/2; *
2d690 2f 0a 20 20 20 20 70 43 75 72 2d 3e 69 78 20 3d  /.    pCur->ix =
2d6a0 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69   (u16)idx;.    i
2d6b0 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  f( xRecordCompar
2d6c0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  e==0 ){.      fo
2d6d0 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2d6e0 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20  64 nCellKey;.   
2d6f0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e       pCell = fin
2d700 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61  dCellPastPtr(pPa
2d710 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20  ge, idx);.      
2d720 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
2d730 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  KeyLeaf ){.     
2d740 20 20 20 20 20 77 68 69 6c 65 28 20 30 78 38 30       while( 0x80
2d750 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29   <= *(pCell++) )
2d760 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
2d770 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e  ( pCell>=pPage->
2d780 61 44 61 74 61 45 6e 64 20 29 7b 0a 20 20 20 20  aDataEnd ){.    
2d790 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2d7a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2d7b0 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
2d7c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d7d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d7e0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2d7f0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2d800 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2d810 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2d820 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2d830 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2d840 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2d850 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2d860 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2d870 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2d880 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2d890 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2d8a0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2d8b0 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2d8c0 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2d8d0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2d8e0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2d8f0 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2d900 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2d910 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36   pCur->ix = (u16
2d920 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2d930 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2d940 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2d950 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
2d960 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2d970 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20  to_next_layer;. 
2d980 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2d990 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
2d9a0 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
2d9b0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
2d9c0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2d9d0 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c  info.nKey = nCel
2d9e0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20  lKey;.          
2d9f0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2da00 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ze = 0;.        
2da10 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2da20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2da30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2da40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2da50 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2da60 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2da70 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2da80 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2da90 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2daa0 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2dab0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2dac0 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2dad0 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2dae0 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2daf0 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2db00 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2db10 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2db20 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2db30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2db40 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2db50 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2db60 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2db70 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2db80 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2db90 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2dba0 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2dbb0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2dbc0 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2dbd0 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2dbe0 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2dbf0 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2dc00 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2dc10 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2dc20 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2dc30 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2dc40 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2dc50 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2dc60 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2dc70 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2dc80 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2dc90 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2dca0 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2dcb0 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2dcc0 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2dcd0 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2dce0 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2dcf0 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2dd00 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2dd10 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2dd20 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2dd30 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2dd40 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2dd50 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2dd60 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2dd70 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2dd80 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2dd90 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2dda0 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2ddb0 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2ddc0 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2ddd0 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2dde0 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2ddf0 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2de00 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2de10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2de20 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2de30 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2de40 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2de50 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2de60 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2de70 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2de80 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2de90 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2dea0 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2deb0 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2dec0 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2ded0 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2dee0 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2def0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2df00 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2df10 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2df20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2df30 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2df40 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2df50 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2df60 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2df70 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2df80 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2df90 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2dfa0 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2dfb0 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2dfc0 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2dfd0 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2dfe0 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2dff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e000 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2e010 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2e020 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2e030 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2e040 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2e050 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2e060 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2e070 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2e080 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2e090 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2e0a0 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2e0b0 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2e0c0 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2e0d0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2e0e0 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2e0f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2e100 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2e110 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2e120 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2e130 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2e140 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2e150 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2e160 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2e170 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2e180 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2e190 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2e1a0 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2e1b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2e1c0 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2e1d0 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2e1e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2e1f0 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2e200 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2e210 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2e220 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2e230 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2e240 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2e250 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2e260 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2e270 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2e280 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2e290 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2e2a0 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2e2b0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2e2c0 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2e2d0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2e2e0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2e2f0 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2e300 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2e310 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2e320 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2e330 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2e340 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2e350 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2e360 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2e370 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2e380 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2e390 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2e3a0 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2e3b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2e3c0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2e3d0 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2e3e0 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2e3f0 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2e400 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2e410 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2e420 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2e430 50 41 47 45 28 70 50 61 67 65 29 3b 0a 20 20 20  PAGE(pPage);.   
2e440 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2e450 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2e460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2e470 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
2e480 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
2e490 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20  ll+18 );.       
2e4a0 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
2e4b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2e4c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2e4d0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2e4e0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2e4f0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2e500 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2e510 70 43 75 72 2d 3e 69 78 20 3d 20 28 75 31 36 29  pCur->ix = (u16)
2e520 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
2e530 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
2e540 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
2e550 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2e560 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 30 29 3b 0a  *)pCellKey, 0);.
2e570 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2e580 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43  curFlags &= ~BTC
2e590 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
2e5a0 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2e5b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2e5c0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2e5d0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ey);.           
2e5e0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2e5f0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2e600 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2e610 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2e620 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70  ell, pCellKey, p
2e630 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  IdxKey);.       
2e640 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e650 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20  pCellKey);.     
2e660 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2e670 65 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20  ert( .          
2e680 20 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43    (pIdxKey->errC
2e690 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ode!=SQLITE_CORR
2e6a0 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20  UPT || c==0).   
2e6b0 20 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65        && (pIdxKe
2e6c0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2e6d0 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72  TE_NOMEM || pCur
2e6e0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61  ->pBtree->db->ma
2e6f0 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20  llocFailed).    
2e700 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2e710 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( c<0 ){.      
2e720 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b      lwr = idx+1;
2e730 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2e740 66 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( c>0 ){.      
2e750 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2e760 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2e770 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e780 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( c==0 );.      
2e790 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2e7a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2e7b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
2e7c0 20 20 20 70 43 75 72 2d 3e 69 78 20 3d 20 28 75     pCur->ix = (u
2e7d0 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2e7e0 20 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65    if( pIdxKey->e
2e7f0 72 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51  rrCode ) rc = SQ
2e800 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2e810 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  T;.          got
2e820 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2e830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e840 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2e850 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e860 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e  assert( lwr+upr>
2e870 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64  =0 );.        id
2e880 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31  x = (lwr+upr)>>1
2e890 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72  ;  /* idx = (lwr
2e8a0 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20  +upr)/2 */.     
2e8b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
2e8c0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
2e8d0 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  || (pPage->intKe
2e8e0 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61  y && !pPage->lea
2e8f0 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  f) );.    assert
2e900 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2e910 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2e920 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2e930 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 78  assert( pCur->ix
2e940 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
2e950 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2e960 72 2d 3e 69 78 20 3d 20 28 75 31 36 29 69 64 78  r->ix = (u16)idx
2e970 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2e980 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2e990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2e9a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2e9b0 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2e9c0 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2e9d0 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2e9e0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2e9f0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2ea00 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2ea10 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2ea20 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2ea30 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2ea40 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2ea50 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2ea60 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
2ea70 78 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  x = (u16)lwr;.  
2ea80 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2ea90 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2eaa0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2eab0 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2eac0 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2ead0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2eae0 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
2eaf0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2eb00 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2eb10 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2eb20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
2eb30 20 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72   TRUE if the cur
2eb40 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74  sor is not point
2eb50 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
2eb60 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  of the table..**
2eb70 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65  .** TRUE will be
2eb80 20 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20   returned after 
2eb90 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
2eba0 33 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76  3BtreeNext() mov
2ebb0 65 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c  es.** past the l
2ebc0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2ebd0 20 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65   table or sqlite
2ebe0 33 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76  3BtreePrev() mov
2ebf0 65 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66  es past.** the f
2ec00 69 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55  irst entry.  TRU
2ec10 45 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  E is also return
2ec20 65 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  ed if the table 
2ec30 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74  is empty..*/.int
2ec40 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66   sqlite3BtreeEof
2ec50 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
2ec60 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61  {.  /* TODO: Wha
2ec70 74 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  t if the cursor 
2ec80 69 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51  is in CURSOR_REQ
2ec90 55 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c  UIRESEEK but all
2eca0 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20   table entries. 
2ecb0 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65   ** have been de
2ecc0 6c 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20  leted? This API 
2ecd0 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61  will need to cha
2ece0 6e 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e  nge to return an
2ecf0 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a   error code.  **
2ed00 20 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20   as well as the 
2ed10 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76  boolean result v
2ed20 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  alue..  */.  ret
2ed30 75 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49  urn (CURSOR_VALI
2ed40 44 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29  D!=pCur->eState)
2ed50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2ed60 6e 20 61 6e 20 65 73 74 69 6d 61 74 65 20 66 6f  n an estimate fo
2ed70 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
2ed80 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
2ed90 65 20 74 68 61 74 20 70 43 75 72 20 69 73 0a 2a  e that pCur is.*
2eda0 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  * pointing to.  
2edb0 52 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76  Return a negativ
2edc0 65 20 6e 75 6d 62 65 72 20 69 66 20 6e 6f 20 65  e number if no e
2edd0 73 74 69 6d 61 74 65 20 69 73 20 63 75 72 72 65  stimate is curre
2ede0 6e 74 6c 79 20 0a 2a 2a 20 61 76 61 69 6c 61 62  ntly .** availab
2edf0 6c 65 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74  le..*/.i64 sqlit
2ee00 65 33 42 74 72 65 65 52 6f 77 43 6f 75 6e 74 45  e3BtreeRowCountE
2ee10 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2ee20 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 75  r){.  i64 n;.  u
2ee30 38 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  8 i;..  assert( 
2ee40 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2ee50 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2ee60 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ee70 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2ee80 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2ee90 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65  ) );..  /* Curre
2eea0 6e 74 6c 79 20 74 68 69 73 20 69 6e 74 65 72 66  ntly this interf
2eeb0 61 63 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ace is only call
2eec0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 66 53  ed by the OP_IfS
2eed0 6d 61 6c 6c 65 72 0a 20 20 2a 2a 20 6f 70 63 6f  maller.  ** opco
2eee0 64 65 2c 20 61 6e 64 20 69 74 20 74 68 61 74 20  de, and it that 
2eef0 63 61 73 65 20 74 68 65 20 63 75 72 73 6f 72 20  case the cursor 
2ef00 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 76  will always be v
2ef10 61 6c 69 64 20 61 6e 64 0a 20 20 2a 2a 20 77 69  alid and.  ** wi
2ef20 6c 6c 20 61 6c 77 61 79 73 20 70 6f 69 6e 74 20  ll always point 
2ef30 74 6f 20 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20  to a leaf node. 
2ef40 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2ef50 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2ef60 53 4f 52 5f 56 41 4c 49 44 29 20 29 20 72 65 74  SOR_VALID) ) ret
2ef70 75 72 6e 20 2d 31 3b 0a 20 20 69 66 28 20 4e 45  urn -1;.  if( NE
2ef80 56 45 52 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  VER(pCur->pPage-
2ef90 3e 6c 65 61 66 3d 3d 30 29 20 29 20 72 65 74 75  >leaf==0) ) retu
2efa0 72 6e 20 2d 31 3b 0a 0a 20 20 6e 20 3d 20 70 43  rn -1;..  n = pC
2efb0 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ur->pPage->nCell
2efc0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
2efd0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
2efe0 7b 0a 20 20 20 20 6e 20 2a 3d 20 70 43 75 72 2d  {.    n *= pCur-
2eff0 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 6e 43 65 6c  >apPage[i]->nCel
2f000 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
2f010 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  n;.}../*.** Adva
2f020 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  nce the cursor t
2f030 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
2f040 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f050 2e 20 0a 2a 2a 20 52 65 74 75 72 6e 20 76 61 6c  . .** Return val
2f060 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 53 51 4c  ue:.**.**    SQL
2f070 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 73 75  ITE_OK        su
2f080 63 63 65 73 73 0a 2a 2a 20 20 20 20 53 51 4c 49  ccess.**    SQLI
2f090 54 45 5f 44 4f 4e 45 20 20 20 20 20 20 63 75 72  TE_DONE      cur
2f0a0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2f0b0 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 6c  ointing at the l
2f0c0 61 73 74 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 20  ast element.**  
2f0d0 20 20 6f 74 68 65 72 77 69 73 65 20 20 20 20 20    otherwise     
2f0e0 20 20 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20     some kind of 
2f0f0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 0a 2a  error occurred.*
2f100 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2f110 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2f120 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2f130 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2f140 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2f150 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2f160 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2f170 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2f180 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2f190 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2f1a0 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2f1b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2f1c0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2f1d0 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2f1e0 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2f1f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2f200 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2f210 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2f220 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2f230 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2f240 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ursor..**.** If 
2f250 62 69 74 20 30 78 30 31 20 6f 66 20 74 68 65 20  bit 0x01 of the 
2f260 46 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 73 71  F argument in sq
2f270 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 43  lite3BtreeNext(C
2f280 2c 46 29 20 69 73 20 31 2c 20 74 68 65 6e 20 74  ,F) is 1, then t
2f290 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 6f 72  he.** cursor cor
2f2a0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2f2b0 51 4c 20 69 6e 64 65 78 20 61 6e 64 20 74 68 69  QL index and thi
2f2c0 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2f2d0 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 73 6b 69  have been.** ski
2f2e0 70 70 65 64 20 69 66 20 74 68 65 20 53 51 4c 20  pped if the SQL 
2f2f0 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 20 61  index had been a
2f300 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2f310 54 68 65 20 46 20 61 72 67 75 6d 65 6e 74 0a 2a  The F argument.*
2f320 2a 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  * is a hint to t
2f330 68 65 20 69 6d 70 6c 65 6d 65 6e 74 2e 20 20 53  he implement.  S
2f340 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c  QLite btree impl
2f350 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2f360 6e 6f 74 20 75 73 65 0a 2a 2a 20 74 68 69 73 20  not use.** this 
2f370 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42 32  hint, but COMDB2
2f380 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   does..*/.static
2f390 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2f3a0 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
2f3b0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2f3c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2f3d0 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2f3e0 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
2f3f0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
2f400 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
2f410 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2f420 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2f430 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2f440 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 69 66 28  R_VALID );.  if(
2f450 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2f460 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2f470 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2f480 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2f490 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2f4a0 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2f4b0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2f4c0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2f4d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2f4e0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2f4f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2f500 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2f510 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2f520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f530 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
2f540 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2f550 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2f560 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2f570 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2f580 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2f590 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2f5a0 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2f5b0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2f5c0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2f5d0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2f5e0 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
2f5f0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2f600 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2f610 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2f620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2f630 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2f640 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2f650 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
2f660 65 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75  e;.  idx = ++pCu
2f670 72 2d 3e 69 78 3b 0a 20 20 69 66 28 20 21 70 50  r->ix;.  if( !pP
2f680 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
2f690 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 6b     /* The only k
2f6a0 6e 6f 77 6e 20 77 61 79 20 66 6f 72 20 74 68 69  nown way for thi
2f6b0 73 20 74 6f 20 68 61 70 70 65 6e 20 69 73 20 66  s to happen is f
2f6c0 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
2f6d0 0a 20 20 20 20 2a 2a 20 72 65 63 75 72 73 69 76  .    ** recursiv
2f6e0 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  e SQL function t
2f6f0 68 61 74 20 64 6f 65 73 20 61 20 44 45 4c 45 54  hat does a DELET
2f700 45 20 6f 70 65 72 61 74 69 6f 6e 20 61 73 20 70  E operation as p
2f710 61 72 74 20 6f 66 20 61 0a 20 20 20 20 2a 2a 20  art of a.    ** 
2f720 53 45 4c 45 43 54 20 77 68 69 63 68 20 64 65 6c  SELECT which del
2f730 65 74 65 73 20 63 6f 6e 74 65 6e 74 20 6f 75 74  etes content out
2f740 20 66 72 6f 6d 20 75 6e 64 65 72 20 61 6e 20 61   from under an a
2f750 63 74 69 76 65 20 63 75 72 73 6f 72 0a 20 20 20  ctive cursor.   
2f760 20 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74   ** in a corrupt
2f770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
2f780 68 65 72 65 20 74 68 65 20 74 61 62 6c 65 20 62  here the table b
2f790 65 69 6e 67 20 44 45 4c 45 54 45 2d 65 64 20 66  eing DELETE-ed f
2f7a0 72 6f 6d 0a 20 20 20 20 2a 2a 20 68 61 73 20 70  rom.    ** has p
2f7b0 61 67 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77  ages in common w
2f7c0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 62 65  ith the table be
2f7d0 69 6e 67 20 71 75 65 72 69 65 64 2e 20 20 53 65  ing queried.  Se
2f7e0 65 20 54 48 33 0a 20 20 20 20 2a 2a 20 6d 6f 64  e TH3.    ** mod
2f7f0 75 6c 65 20 63 6f 76 31 2f 62 74 72 65 65 37 38  ule cov1/btree78
2f800 2e 74 65 73 74 20 74 65 73 74 63 61 73 65 20 32  .test testcase 2
2f810 32 30 20 28 32 30 31 38 2d 30 36 2d 30 38 29 20  20 (2018-06-08) 
2f820 66 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 65 78  for an.    ** ex
2f830 61 6d 70 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 65  ample. */.    re
2f840 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2f850 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
2f860 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62   /* If the datab
2f870 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72  ase file is corr
2f880 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  upt, it is possi
2f890 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ble for the valu
2f8a0 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20 74  e of idx .  ** t
2f8b0 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65 72  o be invalid her
2f8c0 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2f8d0 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63 6f   occur if a seco
2f8e0 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66 69  nd cursor modifi
2f8f0 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  es.  ** the page
2f900 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70 43   while cursor pC
2f910 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  ur is holding a 
2f920 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
2f930 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a 20   Which can.  ** 
2f940 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 74  only happen if t
2f950 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
2f960 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20 61  orrupt in such a
2f970 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b 20   way as to link 
2f980 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e  the.  ** page in
2f990 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  to more than one
2f9a0 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75 72   b-tree structur
2f9b0 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  e. */.  testcase
2f9c0 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43 65  ( idx>pPage->nCe
2f9d0 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64 78  ll );..  if( idx
2f9e0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2f9f0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
2fa00 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2fa10 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
2fa20 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28  (pCur, get4byte(
2fa30 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2fa40 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2fa50 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
2fa60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2fa70 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65       return move
2fa80 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2fa90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
2faa0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2fab0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2fac0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2fad0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2fae0 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  D;.        retur
2faf0 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
2fb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76       }.      mov
2fb10 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b  eToParent(pCur);
2fb20 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70  .      pPage = p
2fb30 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20  Cur->pPage;.    
2fb40 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 78  }while( pCur->ix
2fb50 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2fb60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2fb70 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2fb80 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2fb90 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 30  treeNext(pCur, 0
2fba0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2fbb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2fbc0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
2fbd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2fbe0 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2fbf0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2fc00 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2fc10 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2fc20 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73  ur);.  }.}.int s
2fc30 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2fc40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2fc50 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 4d 65  int flags){.  Me
2fc60 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
2fc70 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2fc80 28 20 66 6c 61 67 73 20 29 3b 20 20 2f 2a 20 55  ( flags );  /* U
2fc90 73 65 64 20 69 6e 20 43 4f 4d 44 42 32 20 62 75  sed in COMDB2 bu
2fca0 74 20 6e 6f 74 20 6e 61 74 69 76 65 20 53 51 4c  t not native SQL
2fcb0 69 74 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ite */.  assert(
2fcc0 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2fcd0 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2fce0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
2fcf0 7c 7c 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20  || flags==1 );. 
2fd00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2fd10 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2fd20 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2fd30 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2fd40 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2fd50 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2fd60 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2fd70 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2fd80 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 69 66 28 20  lidOvfl);.  if( 
2fd90 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2fda0 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74  RSOR_VALID ) ret
2fdb0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2fdc0 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  ur);.  pPage = p
2fdd0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66  Cur->pPage;.  if
2fde0 28 20 28 2b 2b 70 43 75 72 2d 3e 69 78 29 3e 3d  ( (++pCur->ix)>=
2fdf0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2fe00 20 20 20 20 70 43 75 72 2d 3e 69 78 2d 2d 3b 0a      pCur->ix--;.
2fe10 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2fe20 4e 65 78 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Next(pCur);.  }.
2fe30 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2fe40 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2fe50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2fe60 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2fe70 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2fe80 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2fe90 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2fea0 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2feb0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2fec0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2fed0 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 76  ase..** Return v
2fee0 61 6c 75 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  alues:.**.**    
2fef0 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 73   SQLITE_OK     s
2ff00 75 63 63 65 73 73 0a 2a 2a 20 20 20 20 20 53 51  uccess.**     SQ
2ff10 4c 49 54 45 5f 44 4f 4e 45 20 20 20 74 68 65 20  LITE_DONE   the 
2ff20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
2ff30 79 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 65  y on the first e
2ff40 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
2ff50 62 6c 65 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72  ble.**     other
2ff60 77 69 73 65 20 20 20 20 20 73 6f 6d 65 20 6b 69  wise     some ki
2ff70 6e 64 20 6f 66 20 65 72 72 6f 72 20 6f 63 63 75  nd of error occu
2ff80 72 72 65 64 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  rred.**.** The m
2ff90 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74 20  ain entry point 
2ffa0 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  is sqlite3BtreeP
2ffb0 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68 61 74  revious().  That
2ffc0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69   routine is opti
2ffd0 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65  mized.** for the
2ffe0 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20   common case of 
2fff0 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65 6e 74  merely decrement
30000 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ing the cell cou
30010 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69  nter BtCursor.ai
30020 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 70 72  Idx.** to the pr
30030 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e 20 74  evious cell on t
30040 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
30050 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20 62    The (slower) b
30060 74 72 65 65 50 72 65 76 69 6f 75 73 28 29 0a 2a  treePrevious().*
30070 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  * helper routine
30080 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
30090 69 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  it is necessary 
300a0 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66  to move to a dif
300b0 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 6f  ferent page.** o
300c0 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  r to restore the
300d0 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49   cursor..**.** I
300e0 66 20 62 69 74 20 30 78 30 31 20 6f 66 20 74 68  f bit 0x01 of th
300f0 65 20 46 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  e F argument to 
30100 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
30110 69 6f 75 73 28 43 2c 46 29 20 69 73 20 31 2c 20  ious(C,F) is 1, 
30120 74 68 65 6e 0a 2a 2a 20 74 68 65 20 63 75 72 73  then.** the curs
30130 6f 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  or corresponds t
30140 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
30150 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
30160 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 0a  could have been.
30170 2a 2a 20 73 6b 69 70 70 65 64 20 69 66 20 74 68  ** skipped if th
30180 65 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20  e SQL index had 
30190 62 65 65 6e 20 61 20 75 6e 69 71 75 65 20 69 6e  been a unique in
301a0 64 65 78 2e 20 20 54 68 65 20 46 20 61 72 67 75  dex.  The F argu
301b0 6d 65 6e 74 20 69 73 20 61 0a 2a 2a 20 68 69 6e  ment is a.** hin
301c0 74 20 74 6f 20 74 68 65 20 69 6d 70 6c 65 6d 65  t to the impleme
301d0 6e 74 2e 20 20 54 68 65 20 6e 61 74 69 76 65 20  nt.  The native 
301e0 53 51 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70  SQLite btree imp
301f0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
30200 20 6e 6f 74 0a 2a 2a 20 75 73 65 20 74 68 69 73   not.** use this
30210 20 68 69 6e 74 2c 20 62 75 74 20 43 4f 4d 44 42   hint, but COMDB
30220 32 20 64 6f 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  2 does..*/.stati
30230 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
30240 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76 69  E int btreePrevi
30250 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ous(BtCursor *pC
30260 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
30270 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
30280 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
30290 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
302a0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
302b0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
302c0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
302d0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
302e0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  D );.  assert( (
302f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
30300 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54   (BTCF_AtLast|BT
30310 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
30320 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d 3d 30  F_ValidNKey))==0
30330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
30340 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ur->info.nSize==
30350 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
30360 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
30370 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 63 20  VALID ){.    rc 
30380 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
30390 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
303a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
303b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
303c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
303d0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
303e0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
303f0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ate ){.      ret
30400 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
30410 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
30420 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29 7b  Cur->skipNext ){
30430 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
30440 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
30450 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75  SOR_VALID || pCu
30460 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
30470 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20 20  R_SKIPNEXT );.  
30480 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
30490 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b   = CURSOR_VALID;
304a0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
304b0 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a 20  >skipNext<0 ){. 
304c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69         pCur->ski
304d0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20  pNext = 0;.     
304e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
304f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
30500 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78     pCur->skipNex
30510 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = 0;.    }.  }
30520 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
30530 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
30540 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
30550 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
30560 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
30570 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 69 78  t idx = pCur->ix
30580 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
30590 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
305a0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
305b0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
305c0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
305d0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
305e0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
305f0 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
30600 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
30610 69 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ix==0 ){.      i
30620 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
30630 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
30640 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
30650 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
30660 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
30670 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
30680 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
30690 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
306a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
306b0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
306c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
306d0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
306e0 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c   (BTCF_ValidOvfl
306f0 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
30700 75 72 2d 3e 69 78 2d 2d 3b 0a 20 20 20 20 70 50  ur->ix--;.    pP
30710 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
30720 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e;.    if( pPage
30730 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
30740 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
30750 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30760 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
30770 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
30780 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
30790 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
307a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
307b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
307c0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
307d0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 66 6c 61  r *pCur, int fla
307e0 67 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  gs){.  assert( c
307f0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
30800 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
30810 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20 7c 7c  ert( flags==0 ||
30820 20 66 6c 61 67 73 3d 3d 31 20 29 3b 0a 20 20 61   flags==1 );.  a
30830 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
30840 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
30850 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
30860 5f 56 41 4c 49 44 20 29 3b 0a 20 20 55 4e 55 53  _VALID );.  UNUS
30870 45 44 5f 50 41 52 41 4d 45 54 45 52 28 20 66 6c  ED_PARAMETER( fl
30880 61 67 73 20 29 3b 20 20 2f 2a 20 55 73 65 64 20  ags );  /* Used 
30890 69 6e 20 43 4f 4d 44 42 32 20 62 75 74 20 6e 6f  in COMDB2 but no
308a0 74 20 6e 61 74 69 76 65 20 53 51 4c 69 74 65 20  t native SQLite 
308b0 2a 2f 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  */.  pCur->curFl
308c0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
308d0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f  Last|BTCF_ValidO
308e0 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  vfl|BTCF_ValidNK
308f0 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ey);.  pCur->inf
30900 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 69  o.nSize = 0;.  i
30910 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
30920 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a 20 20  =CURSOR_VALID.  
30930 20 7c 7c 20 70 43 75 72 2d 3e 69 78 3d 3d 30 0a   || pCur->ix==0.
30940 20 20 20 7c 7c 20 70 43 75 72 2d 3e 70 50 61 67     || pCur->pPag
30950 65 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  e->leaf==0.  ){.
30960 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
30970 50 72 65 76 69 6f 75 73 28 70 43 75 72 29 3b 0a  Previous(pCur);.
30980 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 78 2d 2d    }.  pCur->ix--
30990 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
309a0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
309b0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
309c0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
309d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
309e0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
309f0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
30a00 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
30a10 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
30a20 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
30a30 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
30a40 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
30a50 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
30a60 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
30a70 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
30a80 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
30a90 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
30aa0 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
30ab0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
30ac0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
30ad0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
30ae0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
30af0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
30b00 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
30b10 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
30b20 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
30b30 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
30b40 20 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74    *ppPage is set
30b50 20 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20   to NULL in the 
30b60 65 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f  event of an erro
30b70 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
30b80 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74  "nearby" paramet
30b90 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65  er is not 0, the
30ba0 6e 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d  n an effort is m
30bb0 61 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74  ade to .** locat
30bc0 65 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74  e a page close t
30bd0 6f 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  o the page numbe
30be0 72 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69  r "nearby".  Thi
30bf0 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e  s can be used in
30c00 20 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74   an.** attempt t
30c10 6f 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70  o keep related p
30c20 61 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61  ages close to ea
30c30 63 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20  ch other in the 
30c40 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a  database file,.*
30c50 2a 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20  * which in turn 
30c60 63 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73  can make databas
30c70 65 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e  e access faster.
30c80 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d  .**.** If the eM
30c90 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ode parameter is
30ca0 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61   BTALLOC_EXACT a
30cb0 6e 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61  nd the nearby pa
30cc0 67 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79  ge exists.** any
30cd0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
30ce0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
30cf0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
30d00 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49   be returned.  I
30d10 66 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54  f.** eMode is BT
30d20 41 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68  ALLOC_LT then th
30d30 65 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20  e page returned 
30d40 77 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61  will be less tha
30d50 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f  n or equal.** to
30d60 20 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73   nearby if any s
30d70 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e  uch page exists.
30d80 20 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54    If eMode is BT
30d90 41 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74  ALLOC_ANY then t
30da0 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72  here.** are no r
30db0 65 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77  estrictions on w
30dc0 68 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74  hich page is ret
30dd0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
30de0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
30df0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
30e00 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
30e10 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
30e20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
30e30 61 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f  age,      /* Sto
30e40 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  re pointer to th
30e50 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
30e60 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
30e70 2a 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  *pPgno,         
30e80 20 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70    /* Store the p
30e90 61 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20  age number here 
30ea0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79  */.  Pgno nearby
30eb0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ,           /* S
30ec0 65 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65  earch for a page
30ed0 20 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a   near this one *
30ee0 2f 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20  /.  u8 eMode    
30ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54             /* BT
30f00 41 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41  ALLOC_EXACT, BTA
30f10 4c 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c  LLOC_LT, or BTAL
30f20 4c 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20  LOC_ANY */.){.  
30f30 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
30f40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
30f50 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
30f60 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
30f70 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
30f80 75 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  u32 k;     /* Nu
30f90 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
30fa0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
30fb0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
30fc0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
30fd0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
30fe0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
30ff0 0a 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20  .  Pgno mxPage; 
31000 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a      /* Total siz
31010 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
31020 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73  e file */..  ass
31030 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31040 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31050 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31060 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
31070 41 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30  ANY || (nearby>0
31080 20 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   && IfNotOmitAV(
31090 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
310a0 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20  ) );.  pPage1 = 
310b0 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d  pBt->pPage1;.  m
310c0 78 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  xPage = btreePag
310d0 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f  ecount(pBt);.  /
310e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
310f0 2d 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65  -05119-02637 The
31100 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4-byte big-endi
31110 61 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  an integer at of
31120 66 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f  fset 36.  ** sto
31130 72 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74  res stores the t
31140 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
31150 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65  ages on the free
31160 6c 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67  list. */.  n = g
31170 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
31180 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74  >aData[36]);.  t
31190 65 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61  estcase( n==mxPa
311a0 67 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e  ge-1 );.  if( n>
311b0 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72  =mxPage ){.    r
311c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
311d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
311e0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
311f0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67  /* There are pag
31200 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
31210 73 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f  st.  Reuse one o
31220 66 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a  f those pages. *
31230 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e  /.    Pgno iTrun
31240 6b 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68  k;.    u8 search
31250 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20  List = 0; /* If 
31260 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75  the free-list mu
31270 73 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66  st be searched f
31280 6f 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20  or 'nearby' */. 
31290 20 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d     u32 nSearch =
312a0 20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f   0;   /* Count o
312b0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
312c0 73 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20  search attempts 
312d0 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49  */.    .    /* I
312e0 66 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  f eMode==BTALLOC
312f0 5f 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65  _EXACT and a que
31300 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  ry of the pointe
31310 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f  r-map.    ** sho
31320 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ws that the page
31330 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d   'nearby' is som
31340 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ewhere on the fr
31350 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20  ee-list, then.  
31360 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d    ** the entire-
31370 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61  list will be sea
31380 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70  rched for that p
31390 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e  age..    */.#ifn
313a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
313b0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
313c0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
313d0 43 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20  C_EXACT ){.     
313e0 20 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50   if( nearby<=mxP
313f0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  age ){.        u
31400 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20  8 eType;.       
31410 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e   assert( nearby>
31420 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
31430 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
31440 63 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20  cuum );.        
31450 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
31460 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79  Bt, nearby, &eTy
31470 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  pe, 0);.        
31480 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
31490 72 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rc;.        if( 
314a0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
314b0 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
314c0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
314d0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
314e0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
314f0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
31500 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73  OC_LE ){.      s
31510 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
31520 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
31530 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
31540 65 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e  e free-list coun
31550 74 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75  t by 1. Set iTru
31560 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  nk to the index 
31570 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  of the.    ** fi
31580 72 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72  rst free-list tr
31590 75 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54  unk page. iPrevT
315a0 72 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c  runk is initiall
315b0 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  y 1..    */.    
315c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
315d0 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
315e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
315f0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
31600 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
31610 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31620 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  , n-1);..    /* 
31630 54 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20  The code within 
31640 74 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e  this loop is run
31650 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68   only once if th
31660 65 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76  e 'searchList' v
31670 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  ariable.    ** i
31680 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65  s not true. Othe
31690 72 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f  rwise, it runs o
316a0 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75  nce for each tru
316b0 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20  nk-page on the. 
316c0 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20     ** free-list 
316d0 75 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27  until the page '
316e0 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74  nearby' is locat
316f0 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  ed (eMode==BTALL
31700 4f 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a  OC_EXACT).    **
31710 20 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65   or until a page
31720 20 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72   less than 'near
31730 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28  by' is located (
31740 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
31750 54 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  T).    */.    do
31760 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
31770 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
31780 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
31790 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  nk ){.        /*
317a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
317b0 30 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20  01506-11053 The 
317c0 66 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e  first integer on
317d0 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
317e0 6b 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  k page.        *
317f0 2a 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  * is the page nu
31800 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
31810 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
31820 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
31830 20 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a   or.        ** z
31840 65 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74  ero if this is t
31850 68 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74  he last freelist
31860 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a   trunk page. */.
31870 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
31880 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
31890 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
318a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
318b0 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
318c0 43 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31  CE-OF: R-59841-1
318d0 33 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20  3798 The 4-byte 
318e0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
318f0 65 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a  er at offset 32.
31900 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
31910 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
31920 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  r of the first p
31930 61 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c  age of the freel
31940 69 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a  ist, or zero if.
31950 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66          ** the f
31960 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79  reelist is empty
31970 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72  . */.        iTr
31980 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
31990 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
319a0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
319b0 20 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75    testcase( iTru
319c0 6e 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20  nk==mxPage );.  
319d0 20 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d      if( iTrunk>m
319e0 78 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68  xPage || nSearch
319f0 2b 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20  ++ > n ){.      
31a00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
31a10 52 52 55 50 54 5f 50 47 4e 4f 28 70 50 72 65 76  RRUPT_PGNO(pPrev
31a20 54 72 75 6e 6b 20 3f 20 70 50 72 65 76 54 72 75  Trunk ? pPrevTru
31a30 6e 6b 2d 3e 70 67 6e 6f 20 3a 20 31 29 3b 0a 20  nk->pgno : 1);. 
31a40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31a50 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
31a60 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c  tUnusedPage(pBt,
31a70 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b   iTrunk, &pTrunk
31a80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
31a90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
31aa0 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30        pTrunk = 0
31ab0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
31ac0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
31ad0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31ae0 61 73 73 65 72 74 28 20 70 54 72 75 6e 6b 21 3d  assert( pTrunk!=
31af0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
31b00 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  t( pTrunk->aData
31b10 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20  !=0 );.      /* 
31b20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
31b30 33 35 32 33 2d 30 34 33 39 34 20 54 68 65 20 73  3523-04394 The s
31b40 65 63 6f 6e 64 20 69 6e 74 65 67 65 72 20 6f 6e  econd integer on
31b50 20 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e   a freelist trun
31b60 6b 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  k page.      ** 
31b70 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
31b80 20 6c 65 61 66 20 70 61 67 65 20 70 6f 69 6e 74   leaf page point
31b90 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a  ers to follow. *
31ba0 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  /.      k = get4
31bb0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
31bc0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
31bd0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
31be0 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
31bf0 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
31c00 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
31c10 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
31c20 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
31c30 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
31c40 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
31c50 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
31c60 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
31c70 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
31c80 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
31c90 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
31ca0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
31cb0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
31cc0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31cd0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
31ce0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
31cf0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
31d00 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
31d10 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
31d20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
31d30 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
31d40 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
31d50 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
31d60 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
31d70 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
31d80 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
31d90 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
31da0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
31db0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
31dc0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
31dd0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
31de0 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
31df0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
31e00 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e 75 73 61  k>(u32)(pBt->usa
31e10 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 29 20 29  bleSize/4 - 2) )
31e20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c  {.        /* Val
31e30 75 65 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f  ue of k is out o
31e40 66 20 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61  f range.  Databa
31e50 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  se corruption */
31e60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
31e70 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 50 47 4e  LITE_CORRUPT_PGN
31e80 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  O(iTrunk);.     
31e90 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
31ea0 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64  cate_page;.#ifnd
31eb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
31ec0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
31ed0 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63 68  }else if( search
31ee0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 20  List .          
31ef0 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d 69 54    && (nearby==iT
31f00 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e 6b 3c  runk || (iTrunk<
31f10 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d  nearby && eMode=
31f20 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20  =BTALLOC_LE)) . 
31f30 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
31f40 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62  /* The list is b
31f50 65 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e  eing searched an
31f60 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67  d this trunk pag
31f70 65 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20  e is the page.  
31f80 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f        ** to allo
31f90 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73  cate, regardless
31fa0 20 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68   of whether it h
31fb0 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20  as leaves..     
31fc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 2a 70     */.        *p
31fd0 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20  Pgno = iTrunk;. 
31fe0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
31ff0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
32000 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
32010 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
32020 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32030 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
32040 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
32050 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
32060 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
32070 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
32080 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
32090 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
320a0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
320b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
320c0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
320d0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
320e0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
320f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
32100 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
32110 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
32120 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70  te(pPrevTrunk->p
32130 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
32140 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
32150 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32160 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32170 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32180 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
32190 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
321a0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
321b0 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
321c0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
321d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
321e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
321f0 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b      /* The trunk
32200 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
32210 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
32220 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  but it contains 
32230 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  .          ** po
32240 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c  inters to free-l
32250 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20  ist leaves. The 
32260 66 69 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d  first leaf becom
32270 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20  es a trunk.     
32280 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
32290 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20  this case..     
322a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
322b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54    MemPage *pNewT
322c0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  runk;.          
322d0 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d  Pgno iNewTrunk =
322e0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
322f0 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20  k->aData[8]);.  
32300 20 20 20 20 20 20 20 20 69 66 28 20 69 4e 65 77          if( iNew
32310 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29 7b 20  Trunk>mxPage ){ 
32320 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
32330 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
32340 5f 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20  _PGNO(iTrunk);. 
32350 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
32360 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
32370 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
32380 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
32390 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78  e( iNewTrunk==mx
323a0 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
323b0 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
323c0 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 69  nusedPage(pBt, i
323d0 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54  NewTrunk, &pNewT
323e0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
323f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
32410 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
32420 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
32430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32440 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
32450 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72  agerWrite(pNewTr
32460 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
32470 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
32480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
32490 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
324a0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
324b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
324c0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
324d0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
324e0 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  }.          memc
324f0 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
32500 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b  Data[0], &pTrunk
32510 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
32520 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
32530 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  te(&pNewTrunk->a
32540 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20  Data[4], k-1);. 
32550 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
32560 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74  &pNewTrunk->aDat
32570 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[8], &pTrunk->a
32580 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a  Data[12], (k-1)*
32590 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  4);.          re
325a0 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72  leasePage(pNewTr
325b0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unk);.          
325c0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
325d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
325e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
325f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
32600 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20  Page1->pDbPage) 
32610 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
32620 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
32630 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77  >aData[32], iNew
32640 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20  Trunk);.        
32650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32660 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32670 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65  3PagerWrite(pPre
32680 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  vTrunk->pDbPage)
32690 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
326a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
326b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
326c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
326d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
326e0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
326f0 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44  (&pPrevTrunk->aD
32700 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e  ata[0], iNewTrun
32710 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  k);.          }.
32720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32730 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
32740 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
32750 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b  LOCATE: %d trunk
32760 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73   - %d free pages
32770 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f   left\n", *pPgno
32780 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  , n-1));.#endif.
32790 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
327a0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  k>0 ){.        /
327b0 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
327c0 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
327d0 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 63  */.        u32 c
327e0 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
327f0 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
32800 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
32810 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
32820 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
32830 20 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29    if( nearby>0 )
32840 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
32850 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  i;.          clo
32860 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
32870 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d 42      if( eMode==B
32880 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20 20 20  TALLOC_LE ){.   
32890 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
328a0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
328b0 20 20 20 20 20 20 20 20 20 20 20 69 50 61 67 65             iPage
328c0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
328d0 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20 20 20 20  ta[8+i*4]);.    
328e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
328f0 61 67 65 3c 3d 6e 65 61 72 62 79 20 29 7b 0a 20  age<=nearby ){. 
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
32910 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20  losest = i;.    
32920 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
32930 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
32940 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
32950 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
32960 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
32970 74 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  t dist;.        
32980 20 20 20 20 64 69 73 74 20 3d 20 73 71 6c 69 74      dist = sqlit
32990 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
329a0 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
329b0 20 6e 65 61 72 62 79 29 3b 0a 20 20 20 20 20 20   nearby);.      
329c0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
329d0 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; i++){.      
329e0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
329f0 20 73 71 6c 69 74 65 33 41 62 73 49 6e 74 33 32   sqlite3AbsInt32
32a00 28 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61  (get4byte(&aData
32a10 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
32a20 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
32a30 20 20 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b    if( d2<dist ){
32a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32a50 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
32a70 73 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20  st = d2;.       
32a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
32aa0 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
32ab0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73  {.          clos
32ac0 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  est = 0;.       
32ad0 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67   }..        iPag
32ae0 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44  e = get4byte(&aD
32af0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
32b00 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
32b10 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78 50 61  ase( iPage==mxPa
32b20 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ge );.        if
32b30 28 20 69 50 61 67 65 3e 6d 78 50 61 67 65 20 29  ( iPage>mxPage )
32b40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32b50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
32b60 50 47 4e 4f 28 69 54 72 75 6e 6b 29 3b 0a 20 20  PGNO(iTrunk);.  
32b70 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
32b80 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
32b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32ba0 20 20 74 65 73 74 63 61 73 65 28 20 69 50 61 67    testcase( iPag
32bb0 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  e==mxPage );.   
32bc0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
32bd0 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20 20 7c  List .         |
32be0 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72 62 79  | (iPage==nearby
32bf0 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61 72 62   || (iPage<nearb
32c00 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
32c10 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
32c20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
32c30 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
32c40 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
32c50 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
32c60 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
32c70 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61 66 20  TE: %d was leaf 
32c80 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72 75 6e  %d of %d on trun
32c90 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20 20 20  k %d".          
32ca0 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d 6f 72         ": %d mor
32cb0 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e 22 2c  e free pages\n",
32cc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32cd0 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73 65 73    *pPgno, closes
32ce0 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e  t+1, k, pTrunk->
32cf0 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20  pgno, n-1));.   
32d00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
32d10 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32d20 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32d30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32d40 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f   ) goto end_allo
32d50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
32d60 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74       if( closest
32d70 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  <k-1 ){.        
32d80 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74      memcpy(&aDat
32d90 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20  a[8+closest*4], 
32da0 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34  &aData[4+k*4], 4
32db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
32dc0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
32dd0 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31  e(&aData[4], k-1
32de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 43  );.          noC
32df0 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65 65 47  ontent = !btreeG
32e00 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  etHasContent(pBt
32e10 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47 45 52  , *pPgno)? PAGER
32e20 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 3a  _GET_NOCONTENT :
32e30 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
32e40 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
32e50 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
32e60 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e  o, ppPage, noCon
32e70 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tent);.         
32e80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32e90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
32ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
32eb0 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
32ec0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
32ed0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
32ee0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
32f00 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
32f10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
32f20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
32f30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
32f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32f50 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
32f60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
32f70 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
32f80 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
32f90 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
32fa0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
32fb0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
32fc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
32fd0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
32fe0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
32ff0 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65 6e 64  elist, so append
33000 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f 20 74   a new page to t
33010 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
33020 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20 2a 2a  se image..    **
33030 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  .    ** Normally
33040 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c 6c 6f  , new pages allo
33050 63 61 74 65 64 20 62 79 20 74 68 69 73 20 62 6c  cated by this bl
33060 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71 75 65  ock can be reque
33070 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  sted from the.  
33080 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79 65 72    ** pager layer
33090 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f   with the 'no-co
330a0 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e  ntent' flag set.
330b0 20 54 68 69 73 20 70 72 65 76 65 6e 74 73 20 74   This prevents t
330c0 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20  he pager.    ** 
330d0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 72  from trying to r
330e0 65 61 64 20 74 68 65 20 70 61 67 65 73 20 63 6f  ead the pages co
330f0 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 2e  ntent from disk.
33100 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65   However, if the
33110 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
33120 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
33130 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e 65 20  already run one 
33140 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d 65 6e  or more incremen
33150 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20 20 2a  tal-vacuum.    *
33160 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20 74 68  * steps, then th
33170 65 20 70 61 67 65 20 77 65 20 61 72 65 20 61 62  e page we are ab
33180 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  out to allocate 
33190 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f 6e 74  may contain cont
331a0 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ent.    ** that 
331b0 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
331c0 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f  he event of a ro
331d0 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69 73 20  llback. In this 
331e0 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a 2a 20  case, do.    ** 
331f0 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f 2d 63  not set the no-c
33200 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54 68 69  ontent flag. Thi
33210 73 20 63 61 75 73 65 73 20 74 68 65 20 70 61 67  s causes the pag
33220 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64 20 6a  er to load and j
33230 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 74 68  ournal.    ** th
33240 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 63  e current page c
33250 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20 6f 76  ontent before ov
33260 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  erwriting it..  
33270 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
33280 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
33290 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61 6c 6c  will not actuall
332a0 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61  y attempt to loa
332b0 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a 20 20  d or journal .  
332c0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66 6f 72    ** content for
332d0 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20 72   any page that r
332e0 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65 20 70  eally does lie p
332f0 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
33300 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
33310 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  ** file on disk.
33320 20 53 6f 20 74 68 65 20 65 66 66 65 63 74 73 20   So the effects 
33330 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  of disabling the
33340 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70 74 69   no-content opti
33350 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  mization.    ** 
33360 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69 6e 65  here are confine
33370 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73  d to those pages
33380 20 74 68 61 74 20 6c 69 65 20 62 65 74 77 65 65   that lie betwee
33390 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
333a0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
333b0 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65 20 65   image and the e
333c0 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  nd of the databa
333d0 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
333e0 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e 74 65      int bNoConte
333f0 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74 4f 6d  nt = (0==IfNotOm
33400 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72 75  itAV(pBt->bDoTru
33410 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52 5f 47  ncate))? PAGER_G
33420 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30 3b 0a  ET_NOCONTENT:0;.
33430 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
33440 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d  3PagerWrite(pBt-
33450 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  >pPage1->pDbPage
33460 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
33470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
33480 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
33490 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d   if( pBt->nPage=
334a0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
334b0 47 45 28 70 42 74 29 20 29 20 70 42 74 2d 3e 6e  GE(pBt) ) pBt->n
334c0 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64 65 66  Page++;..#ifndef
334d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
334e0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
334f0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
33500 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
33510 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65  (pBt, pBt->nPage
33520 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
33530 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
33540 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
33550 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
33560 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
33570 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
33580 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
33590 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
335a0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
335b0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
335c0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
335d0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
335e0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
335f0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
33600 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
33610 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d 20 30  MemPage *pPg = 0
33620 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
33630 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
33640 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
33650 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
33660 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  \n", pBt->nPage)
33670 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
33680 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50 45 4e   pBt->nPage!=PEN
33690 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
336a0 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72 63 20  Bt) );.      rc 
336b0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
336c0 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d 3e 6e  Page(pBt, pBt->n
336d0 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e 6f 43  Page, &pPg, bNoC
336e0 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 69  ontent);.      i
336f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
33700 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
33710 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
33720 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67 65 29  te(pPg->pDbPage)
33730 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
33740 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  ePage(pPg);.    
33750 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
33760 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
33770 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b      pBt->nPage++
33780 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
33790 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f  >nPage==PENDING_
337a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
337b0 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 20  { pBt->nPage++; 
337c0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
337d0 20 20 20 70 75 74 34 62 79 74 65 28 32 38 20 2b     put4byte(28 +
337e0 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61 67 65   (u8*)pBt->pPage
337f0 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 6e  1->aData, pBt->n
33800 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50 67 6e  Page);.    *pPgn
33810 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  o = pBt->nPage;.
33820 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50  .    assert( *pP
33830 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
33840 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
33850 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
33860 55 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20  UnusedPage(pBt, 
33870 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
33880 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
33890 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
338a0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
338b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
338c0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
338d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
338e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
338f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
33900 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
33910 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  *ppPage = 0;.   
33920 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41   }.    TRACE(("A
33930 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d  LLOCATE: %d from
33940 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c   end of file\n",
33950 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a   *pPgno));.  }..
33960 20 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f    assert( *pPgno
33970 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
33980 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64  AGE(pBt) );..end
33990 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a  _allocate_page:.
339a0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
339b0 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65  runk);.  release
339c0 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29  Page(pPrevTrunk)
339d0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
339e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
339f0 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
33a00 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d  count((*ppPage)-
33a10 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29 3b 0a  >pDbPage)<=1 );.
33a20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
33a30 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70 70 50  LITE_OK || (*ppP
33a40 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
33a50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
33a60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
33a70 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
33a80 6f 20 61 64 64 20 70 61 67 65 20 69 50 61 67 65  o add page iPage
33a90 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
33aa0 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73 74 2e   file free-list.
33ab0 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73 75 6d   .** It is assum
33ac0 65 64 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ed that the page
33ad0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
33ae0 61 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  a part of the fr
33af0 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  ee-list..**.** T
33b00 68 65 20 76 61 6c 75 65 20 70 61 73 73 65 64 20  he value passed 
33b10 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
33b20 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
33b30 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74 69 6f  unction is optio
33b40 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63  nal..** If the c
33b50 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20 74 6f  aller happens to
33b60 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65 72 20   have a pointer 
33b70 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
33b80 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72 65 73  bject .** corres
33b90 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67 65 20  ponding to page 
33ba0 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69 74 20  iPage handy, it 
33bb0 6d 61 79 20 70 61 73 73 20 69 74 20 61 73 20 74  may pass it as t
33bc0 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75 65 2e  he second value.
33bd0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
33be0 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55 4c 4c  it may pass NULL
33bf0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70 6f 69  ..**.** If a poi
33c00 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50 61 67  nter to a MemPag
33c10 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61 73 73  e object is pass
33c20 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
33c30 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 69 74   argument,.** it
33c40 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
33c50 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72 65 64  t is not altered
33c60 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
33c70 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
33c80 20 66 72 65 65 50 61 67 65 32 28 42 74 53 68 61   freePage2(BtSha
33c90 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50 61 67  red *pBt, MemPag
33ca0 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50 67 6e  e *pMemPage, Pgn
33cb0 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50  o iPage){.  MemP
33cc0 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b  age *pTrunk = 0;
33cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ce0 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74 72 75  /* Free-list tru
33cf0 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e  nk page */.  Pgn
33d00 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20  o iTrunk = 0;   
33d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
33d30 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  of free-list tru
33d40 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20 4d 65  nk page */ .  Me
33d50 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
33d60 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20 20 20  pBt->pPage1;    
33d70 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66 65 72    /* Local refer
33d80 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a  ence to page 1 *
33d90 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
33da0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
33db0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
33dc0 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d 61 79  being freed. May
33dd0 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69   be NULL. */.  i
33de0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
33df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e00 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
33e10 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65  e */.  int nFree
33e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33e30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
33e40 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
33e50 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d 6c 69  pages on free-li
33e60 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
33e70 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
33e80 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
33e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
33ea0 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61 67 65  RUPT_DB || iPage
33eb0 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >1 );.  assert( 
33ec0 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65  !pMemPage || pMe
33ed0 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61  mPage->pgno==iPa
33ee0 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69 50 61  ge );..  if( iPa
33ef0 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20 53 51  ge<2 ) return SQ
33f00 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
33f10 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67  T;.  if( pMemPag
33f20 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d  e ){.    pPage =
33f30 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73   pMemPage;.    s
33f40 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70  qlite3PagerRef(p
33f50 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
33f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
33f70 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  ge = btreePageLo
33f80 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29  okup(pBt, iPage)
33f90 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72  ;.  }..  /* Incr
33fa0 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70  ement the free p
33fb0 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61  age count on pPa
33fc0 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ge1 */.  rc = sq
33fd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
33fe0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
33ff0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
34000 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
34010 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
34020 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34030 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
34040 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34050 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b  a[36], nFree+1);
34060 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62 74 73  ..  if( pBt->bts
34070 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55  Flags & BTS_SECU
34080 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  RE_DELETE ){.   
34090 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 75 72   /* If the secur
340a0 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f 6e 20  e_delete option 
340b0 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
340c0 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  .    ** always f
340d0 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
340e0 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
340f0 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
34100 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 21     */.    if( (!
34110 70 50 61 67 65 20 26 26 20 28 28 72 63 20 3d 20  pPage && ((rc = 
34120 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
34130 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
34140 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20   0))!=0) ).     
34150 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20 28 28  ||            ((
34160 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
34170 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
34180 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20 20 20  bPage))!=0).    
34190 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
341a0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
341b0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61  }.    memset(pPa
341c0 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
341d0 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
341e0 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ze);.  }..  /* I
341f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
34200 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
34210 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
34220 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
34230 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
34240 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
34250 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
34260 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
34270 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 70 74  VACUUM ){.    pt
34280 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69 50 61  rmapPut(pBt, iPa
34290 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50  ge, PTRMAP_FREEP
342a0 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a 20 20  AGE, 0, &rc);.  
342b0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
342c0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
342d0 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e 69  }..  /* Now mani
342e0 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75 61  pulate the actua
342f0 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d  l database free-
34300 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e 20  list structure. 
34310 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20 20  There are two.  
34320 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  ** possibilities
34330 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69  . If the free-li
34340 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  st is currently 
34350 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68 65  empty, or if the
34360 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75 6e   first.  ** trun
34370 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
34380 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c 2c  ee-list is full,
34390 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
343a0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20 20  will become a.  
343b0 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74  ** new free-list
343c0 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74 68   trunk page. Oth
343d0 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c 20  erwise, it will 
343e0 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f 66  become a leaf of
343f0 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
34400 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
34410 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d 6c  e current free-l
34420 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ist. This block 
34430 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a 2a  tests if it.  **
34440 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
34450 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73 20  add the page as 
34460 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74 20  a new free-list 
34470 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  leaf..  */.  if(
34480 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20 20   nFree!=0 ){.   
34490 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20 20 20   u32 nLeaf;     
344a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
344b0 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  itial number of 
344c0 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74 72  leaf cells on tr
344d0 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20 20  unk page */..   
344e0 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
344f0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
34500 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20 3d  a[32]);.    rc =
34510 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
34520 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72 75  t, iTrunk, &pTru
34530 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
34540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34550 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65  .      goto free
34560 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
34570 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67 65 74  .    nLeaf = get
34580 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61  4byte(&pTrunk->a
34590 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 61 73  Data[4]);.    as
345a0 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
345b0 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20 20 20  eSize>32 );.    
345c0 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75 33 32  if( nLeaf > (u32
345d0 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
345e0 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20 20 20  /4 - 2 ){.      
345f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
34600 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
34610 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
34620 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
34630 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29 70 42   nLeaf < (u32)pB
34640 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
34650 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  - 8 ){.      /* 
34660 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
34670 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20 74 68  re is room on th
34680 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74 6f 20  e trunk page to 
34690 69 6e 73 65 72 74 20 74 68 65 20 70 61 67 65 0a  insert the page.
346a0 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 66        ** being f
346b0 72 65 65 64 20 61 73 20 61 20 6e 65 77 20 6c 65  reed as a new le
346c0 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  af..      **.   
346d0 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
346e0 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69  the trunk page i
346f0 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c  s not really ful
34700 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61  l until it conta
34710 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75 73 61  ins.      ** usa
34720 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e  bleSize/4 - 2 en
34730 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c  tries, not usabl
34740 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
34750 69 65 73 20 61 73 20 77 65 20 68 61 76 65 0a 20  ies as we have. 
34760 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20       ** coded.  
34770 42 75 74 20 64 75 65 20 74 6f 20 61 20 63 6f 64  But due to a cod
34780 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76 65 72  ing error in ver
34790 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
347a0 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a  prior to.      *
347b0 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62 61 73  * 3.6.0, databas
347c0 65 73 20 77 69 74 68 20 66 72 65 65 6c 69 73 74  es with freelist
347d0 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c   trunk pages hol
347e0 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20  ding more than. 
347f0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
34800 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
34810 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72 74 65   will be reporte
34820 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20 20 49  d as corrupt.  I
34830 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a  n order.      **
34840 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62 61 63   to maintain bac
34850 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
34860 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65 72 20  lity with older 
34870 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
34880 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77 65 20  te,.      ** we 
34890 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
348a0 20 72 65 73 74 72 69 63 74 20 74 68 65 20 6e 75   restrict the nu
348b0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
348c0 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  to usableSize/4 
348d0 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  - 8.      ** for
348e0 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65 20 70   now.  At some p
348f0 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  oint in the futu
34900 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79 6f 6e  re (once everyon
34910 65 20 68 61 73 20 75 70 67 72 61 64 65 64 0a 20  e has upgraded. 
34920 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36 2e 30       ** to 3.6.0
34930 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20 73 68   or later) we sh
34940 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20 66 69  ould consider fi
34950 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69 74 69  xing the conditi
34960 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20 20 20  onal above.     
34970 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75 73 61   ** to read "usa
34980 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69 6e 73  bleSize/4-2" ins
34990 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c 65 53  tead of "usableS
349a0 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20 20 20  ize/4-8"..      
349b0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44  **.      ** EVID
349c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39 32 30  ENCE-OF: R-19920
349d0 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72 2c 20  -11576 However, 
349e0 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
349f0 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c 0a 20  f SQLite still. 
34a00 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20 75 73       ** avoid us
34a10 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73 69 78  ing the last six
34a20 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
34a30 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
34a40 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20 20 20  age array in.   
34a50 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68 61 74     ** order that
34a60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
34a70 63 72 65 61 74 65 64 20 62 79 20 6e 65 77 65 72  created by newer
34a80 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
34a90 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20 20 20  ite can be.     
34aa0 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c 64 65   ** read by olde
34ab0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
34ac0 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  Lite..      */. 
34ad0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34ae0 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
34af0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
34b00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
34b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34b20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
34b30 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e 4c 65  k->aData[4], nLe
34b40 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70  af+1);.        p
34b50 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
34b60 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66 2a 34  >aData[8+nLeaf*4
34b70 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20  ], iPage);.     
34b80 20 20 20 69 66 28 20 70 50 61 67 65 20 26 26 20     if( pPage && 
34b90 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26  (pBt->btsFlags &
34ba0 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
34bb0 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  TE)==0 ){.      
34bc0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
34bd0 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67 65 2d  DontWrite(pPage-
34be0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
34bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
34c00 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  = btreeSetHasCon
34c10 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65 29  tent(pBt, iPage)
34c20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34c30 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
34c40 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74 72  E: %d leaf on tr
34c50 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c 70  unk page %d\n",p
34c60 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e  Page->pgno,pTrun
34c70 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
34c80 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
34c90 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ut;.    }.  }.. 
34ca0 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 66   /* If control f
34cb0 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f 69  lows to this poi
34cc0 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73 20  nt, then it was 
34cd0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
34ce0 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68 65  add the.  ** the
34cf0 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
34d00 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67 65  d as a leaf page
34d10 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 72   of the first tr
34d20 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d  unk in the free-
34d30 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73 69  list..  ** Possi
34d40 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
34d50 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d 70  free-list is emp
34d60 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79 20  ty, or possibly 
34d70 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20 2a  because the .  *
34d80 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69 6e  * first trunk in
34d90 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69   the free-list i
34da0 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20 77  s full. Either w
34db0 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65 69  ay, the page bei
34dc0 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77 69  ng freed.  ** wi
34dd0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e 65  ll become the ne
34de0 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70 61  w first trunk pa
34df0 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c  ge in the free-l
34e00 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
34e10 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51 4c 49  pPage==0 && SQLI
34e20 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62 74 72  TE_OK!=(rc = btr
34e30 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
34e40 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29  Page, &pPage, 0)
34e50 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  ) ){.    goto fr
34e60 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
34e70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
34e80 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
34e90 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
34ea0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34eb0 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61  .    goto freepa
34ec0 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 70 75  ge_out;.  }.  pu
34ed0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
34ee0 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a 20 20  ata, iTrunk);.  
34ef0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
34f00 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20  >aData[4], 0);. 
34f10 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
34f20 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 50  1->aData[32], iP
34f30 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28 28 22  age);.  TRACE(("
34f40 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
34f50 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
34f60 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20 70 50  lacing %d\n", pP
34f70 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72 75 6e  age->pgno, iTrun
34f80 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65 5f 6f  k));..freepage_o
34f90 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67 65 20  ut:.  if( pPage 
34fa0 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  ){.    pPage->is
34fb0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
34fc0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
34fd0 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
34fe0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74  e(pTrunk);.  ret
34ff0 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69 63  urn rc;.}.static
35000 20 76 6f 69 64 20 66 72 65 65 50 61 67 65 28 4d   void freePage(M
35010 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
35020 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66 28 20  nt *pRC){.  if( 
35030 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45 5f 4f  (*pRC)==SQLITE_O
35040 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  K ){.    *pRC = 
35050 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
35060 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
35070 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 7d  ge->pgno);.  }.}
35080 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
35090 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
350a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
350b0 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 20  the given Cell. 
350c0 20 53 74 6f 72 65 0a 2a 2a 20 73 69 7a 65 20 69   Store.** size i
350d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
350e0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 70 49 6e   the cell in pIn
350f0 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  fo..*/.static in
35100 74 20 63 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d  t clearCell(.  M
35110 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
35120 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
35130 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
35140 73 20 74 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20  s the Cell */.  
35150 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
35160 43 65 6c 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73  Cell,    /* Firs
35170 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 43 65  t byte of the Ce
35180 6c 6c 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  ll */.  CellInfo
35190 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
351a0 20 2f 2a 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61   /* Size informa
351b0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63  tion about the c
351c0 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ell */.){.  BtSh
351d0 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 50 67 6e  ared *pBt;.  Pgn
351e0 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e  o ovflPgno;.  in
351f0 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66  t rc;.  int nOvf
35200 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50 61 67  l;.  u32 ovflPag
35210 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74  eSize;..  assert
35220 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
35230 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
35240 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61  >mutex) );.  pPa
35250 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
35260 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e  Page, pCell, pIn
35270 66 6f 29 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f  fo);.  if( pInfo
35280 2d 3e 6e 4c 6f 63 61 6c 3d 3d 70 49 6e 66 6f 2d  ->nLocal==pInfo-
35290 3e 6e 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  >nPayload ){.   
352a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
352b0 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c  K;  /* No overfl
352c0 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e  ow pages. Return
352d0 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
352e0 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20  nything */.  }. 
352f0 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c   testcase( pCell
35300 20 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   + pInfo->nSize 
35310 3d 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  == pPage->aDataE
35320 6e 64 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  nd );.  testcase
35330 28 20 70 43 65 6c 6c 20 2b 20 28 70 49 6e 66 6f  ( pCell + (pInfo
35340 2d 3e 6e 53 69 7a 65 2d 31 29 20 3d 3d 20 70 50  ->nSize-1) == pP
35350 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
35360 0a 20 20 69 66 28 20 70 43 65 6c 6c 20 2b 20 70  .  if( pCell + p
35370 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3e 20 70 50  Info->nSize > pP
35380 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 7b  age->aDataEnd ){
35390 0a 20 20 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  .    /* Cell ext
353a0 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
353b0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72 65 74   page */.    ret
353c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
353d0 50 54 5f 50 41 47 45 28 70 50 61 67 65 29 3b 0a  PT_PAGE(pPage);.
353e0 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
353f0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 20   get4byte(pCell 
35400 2b 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 2d  + pInfo->nSize -
35410 20 34 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61   4);.  pBt = pPa
35420 67 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72  ge->pBt;.  asser
35430 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  t( pBt->usableSi
35440 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c  ze > 4 );.  ovfl
35450 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  PageSize = pBt->
35460 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
35470 20 20 6e 4f 76 66 6c 20 3d 20 28 70 49 6e 66 6f    nOvfl = (pInfo
35480 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d 20 70 49 6e  ->nPayload - pIn
35490 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66  fo->nLocal + ovf
354a0 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f  lPageSize - 1)/o
354b0 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61  vflPageSize;.  a
354c0 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c  ssert( nOvfl>0 |
354d0 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f  | .    (CORRUPT_
354e0 44 42 20 26 26 20 28 70 49 6e 66 6f 2d 3e 6e 50  DB && (pInfo->nP
354f0 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67  ayload + ovflPag
35500 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53  eSize)<ovflPageS
35510 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c  ize).  );.  whil
35520 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
35530 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
35540 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
35550 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
35560 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
35570 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
35580 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
35590 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
355a0 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
355b0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
355c0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
355d0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
355e0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
355f0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
35600 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
35610 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
35620 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
35630 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
35640 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
35650 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
35660 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
35670 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
35680 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
35690 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
356a0 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
356b0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
356c0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
356d0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
356e0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
356f0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
35700 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
35710 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
35720 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
35730 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
35740 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
35750 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
35760 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
35770 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
35780 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
35790 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
357a0 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
357b0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
357c0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
357d0 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
357e0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
357f0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
35800 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
35810 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
35820 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
35830 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
35840 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
35850 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
35860 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
35870 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
35880 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
35890 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
358a0 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
358b0 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
358c0 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
358d0 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
358e0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
358f0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
35900 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
35910 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
35920 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
35930 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
35940 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
35950 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
35960 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
35970 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
35980 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
35990 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
359a0 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
359b0 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
359c0 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
359d0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
359e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
359f0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
35a00 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
35a10 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
35a20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
35a30 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
35a40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
35a50 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
35a60 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
35a70 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
35a80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
35a90 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
35aa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
35ab0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
35ac0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
35ad0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
35ae0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
35af0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
35b00 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
35b10 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
35b20 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
35b30 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
35b40 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
35b50 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
35b60 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
35b70 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
35b80 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
35b90 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
35ba0 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
35bb0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
35bc0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
35bd0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
35be0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
35bf0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
35c00 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
35c10 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
35c20 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
35c30 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
35c40 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
35c50 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
35c60 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
35c70 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
35c80 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
35c90 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
35ca0 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
35cb0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
35cc0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
35cd0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
35ce0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
35cf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
35d00 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
35d10 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
35d20 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
35d30 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
35d40 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
35d50 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
35d60 6f 6e 73 74 20 42 74 72 65 65 50 61 79 6c 6f 61  onst BtreePayloa
35d70 64 20 2a 70 58 2c 20 20 20 20 20 20 20 20 2f 2a  d *pX,        /*
35d80 20 50 61 79 6c 6f 61 64 20 77 69 74 68 20 77 68   Payload with wh
35d90 69 63 68 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ich to construct
35da0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69   the cell */.  i
35db0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
35dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35dd0 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
35de0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
35df0 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
35e00 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
35e10 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 2c  int nSrc, n, rc,
35e20 20 6d 6e 3b 0a 20 20 69 6e 74 20 73 70 61 63 65   mn;.  int space
35e30 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Left;.  MemPage 
35e40 2a 70 54 6f 52 65 6c 65 61 73 65 3b 0a 20 20 75  *pToRelease;.  u
35e50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
35e60 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
35e70 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
35e80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35e90 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66  ;.  Pgno pgnoOvf
35ea0 6c 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  l;.  int nHeader
35eb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
35ec0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35ed0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
35ee0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
35ef0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
35f00 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
35f10 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
35f20 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
35f30 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
35f40 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
35f50 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
35f60 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
35f70 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
35f80 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
35f90 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
35fa0 61 74 61 5b 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ata[pPage->pBt->
35fb0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
35fc0 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
35fd0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
35fe0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35ff0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
36000 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
36010 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61  .  nHeader = pPa
36020 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
36030 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
36040 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e 50 61  ntKey ){.    nPa
36050 79 6c 6f 61 64 20 3d 20 70 58 2d 3e 6e 44 61 74  yload = pX->nDat
36060 61 20 2b 20 70 58 2d 3e 6e 5a 65 72 6f 3b 0a 20  a + pX->nZero;. 
36070 20 20 20 70 53 72 63 20 3d 20 70 58 2d 3e 70 44     pSrc = pX->pD
36080 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
36090 70 58 2d 3e 6e 44 61 74 61 3b 0a 20 20 20 20 61  pX->nData;.    a
360a0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
360b0 74 4b 65 79 4c 65 61 66 20 29 3b 20 2f 2a 20 66  tKeyLeaf ); /* f
360c0 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79  illInCell() only
360d0 20 63 61 6c 6c 65 64 20 66 6f 72 20 6c 65 61 76   called for leav
360e0 65 73 20 2a 2f 0a 20 20 20 20 6e 48 65 61 64 65  es */.    nHeade
360f0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32  r += putVarint32
36100 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
36110 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20  , nPayload);.   
36120 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
36130 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
36140 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26 70  ader], *(u64*)&p
36150 58 2d 3e 6e 4b 65 79 29 3b 0a 20 20 7d 65 6c 73  X->nKey);.  }els
36160 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
36170 58 2d 3e 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66  X->nKey<=0x7ffff
36180 66 66 66 20 26 26 20 70 58 2d 3e 70 4b 65 79 21  fff && pX->pKey!
36190 3d 30 20 29 3b 0a 20 20 20 20 6e 53 72 63 20 3d  =0 );.    nSrc =
361a0 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
361b0 29 70 58 2d 3e 6e 4b 65 79 3b 0a 20 20 20 20 70  )pX->nKey;.    p
361c0 53 72 63 20 3d 20 70 58 2d 3e 70 4b 65 79 3b 0a  Src = pX->pKey;.
361d0 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
361e0 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
361f0 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
36200 6c 6f 61 64 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  load);.  }.  .  
36210 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
36220 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 70 50 61 79  ayload */.  pPay
36230 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
36240 65 61 64 65 72 5d 3b 0a 20 20 69 66 28 20 6e 50  eader];.  if( nP
36250 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
36260 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
36270 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 6f  * This is the co
36280 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
36290 65 76 65 72 79 74 68 69 6e 67 20 66 69 74 73 20  everything fits 
362a0 6f 6e 20 74 68 65 20 62 74 72 65 65 20 70 61 67  on the btree pag
362b0 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 6e 6f 20  e.    ** and no 
362c0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
362d0 72 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  re required. */.
362e0 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65 72 20      n = nHeader 
362f0 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  + nPayload;.    
36300 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33 20 29  testcase( n==3 )
36310 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36320 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66 28 20  n==4 );.    if( 
36330 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20 20 20  n<4 ) n = 4;.   
36340 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a 20 20   *pnSize = n;.  
36350 20 20 61 73 73 65 72 74 28 20 6e 53 72 63 3c 3d    assert( nSrc<=
36360 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20  nPayload );.    
36370 74 65 73 74 63 61 73 65 28 20 6e 53 72 63 3c 6e  testcase( nSrc<n
36380 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 6d  Payload );.    m
36390 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
363a0 70 53 72 63 2c 20 6e 53 72 63 29 3b 0a 20 20 20  pSrc, nSrc);.   
363b0 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64   memset(pPayload
363c0 2b 6e 53 72 63 2c 20 30 2c 20 6e 50 61 79 6c 6f  +nSrc, 0, nPaylo
363d0 61 64 2d 6e 53 72 63 29 3b 0a 20 20 20 20 72 65  ad-nSrc);.    re
363e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
363f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
36400 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
36410 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
36420 73 6f 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 74  some of the cont
36430 65 6e 74 20 77 69 6c 6c 20 6e 65 65 64 0a 20 20  ent will need.  
36440 2a 2a 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f  ** to spill onto
36450 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
36460 0a 20 20 2a 2f 0a 20 20 6d 6e 20 3d 20 70 50 61  .  */.  mn = pPa
36470 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
36480 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
36490 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
364a0 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
364b0 7a 65 20 2d 20 34 29 3b 0a 20 20 74 65 73 74 63  ze - 4);.  testc
364c0 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d  ase( n==pPage->m
364d0 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
364e0 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
364f0 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
36500 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e   if( n > pPage->
36510 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d  maxLocal ) n = m
36520 6e 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  n;.  spaceLeft =
36530 20 6e 3b 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20   n;.  *pnSize = 
36540 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b 20 34 3b  n + nHeader + 4;
36550 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43 65  .  pPrior = &pCe
36560 6c 6c 5b 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20  ll[nHeader+n];. 
36570 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b   pToRelease = 0;
36580 0a 20 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  .  pgnoOvfl = 0;
36590 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
365a0 70 42 74 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  pBt;..  /* At th
365b0 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62 6c  is point variabl
365c0 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74  es should be set
365d0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
365e0 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f 61  *.  **   nPayloa
365f0 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74 61  d           Tota
36600 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 69  l payload size i
36610 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20 70  n bytes.  **   p
36620 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20  Payload         
36630 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67 20    Begin writing 
36640 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20 2a  payload here.  *
36650 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20 20  *   spaceLeft   
36660 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76 61         Space ava
36670 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c 6f  ilable at pPaylo
36680 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61 64  ad.  If nPayload
36690 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a 2a  >spaceLeft,.  **
366a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366b0 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e 73        that means
366c0 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73 70   content must sp
366d0 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f  ill into overflo
366e0 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20 20  w pages..  **   
366f0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
36700 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6c     Size of the l
36710 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20 63  ocal cell (not c
36720 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f 77  ounting overflow
36730 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20 70   pages).  **   p
36740 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20 20  Prior           
36750 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65    Where to write
36760 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68 65   the pgno of the
36770 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
36780 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 55  page.  **.  ** U
36790 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74 72  se a call to btr
367a0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
367b0 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
367c0 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76 65  the values above
367d0 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70 75  .  ** were compu
367e0 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ted correctly.. 
367f0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
36800 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  E_DEBUG.  {.    
36810 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
36820 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
36830 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
36840 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
36850 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d  ssert( nHeader==
36860 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
36870 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
36880 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
36890 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20  .nKey==pX->nKey 
368a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
368b0 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e  pnSize == info.n
368c0 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
368d0 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d  rt( spaceLeft ==
368e0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a   info.nLocal );.
368f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
36900 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f   Write the paylo
36910 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ad into the loca
36920 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65  l Cell and any e
36930 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c  xtra into overfl
36940 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68  ow pages */.  wh
36950 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 6e 20  ile( 1 ){.    n 
36960 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
36970 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20  if( n>spaceLeft 
36980 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b  ) n = spaceLeft;
36990 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52  ..    /* If pToR
369a0 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65  elease is not ze
369b0 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64  ro than pPayload
369c0 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65   points into the
369d0 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a   data area.    *
369e0 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e  * of pToRelease.
369f0 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52    Make sure pToR
36a00 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20  elease is still 
36a10 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20  writeable. */.  
36a20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
36a30 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
36a40 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
36a50 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
36a60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
36a70 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69  /* If pPayload i
36a80 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
36a90 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
36aa0 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
36ab0 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73   pPage.    ** is
36ac0 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
36ad0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36ae0 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e  pPayload<pPage->
36af0 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61  aData || pPayloa
36b00 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  d>=&pPage->aData
36b10 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
36b20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
36b30 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
36b40 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
36b50 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69  bPage) );..    i
36b60 66 28 20 6e 53 72 63 3e 3d 6e 20 29 7b 0a 20 20  f( nSrc>=n ){.  
36b70 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
36b80 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
36b90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 72     }else if( nSr
36ba0 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  c>0 ){.      n =
36bb0 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 6d 65 6d   nSrc;.      mem
36bc0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
36bd0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
36be0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
36bf0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
36c00 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
36c10 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  oad -= n;.    if
36c20 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 30 20 29 20  ( nPayload<=0 ) 
36c30 62 72 65 61 6b 3b 0a 20 20 20 20 70 50 61 79 6c  break;.    pPayl
36c40 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53  oad += n;.    pS
36c50 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72  rc += n;.    nSr
36c60 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  c -= n;.    spac
36c70 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20  eLeft -= n;.    
36c80 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d 30  if( spaceLeft==0
36c90 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   ){.      MemPag
36ca0 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 23 69  e *pOvfl = 0;.#i
36cb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36cc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
36cd0 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
36ce0 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
36cf0 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
36d00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
36d10 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
36d20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
36d30 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
36d40 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
36d50 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
36d60 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
36d70 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
36d80 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
36d90 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
36da0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
36db0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
36dc0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
36dd0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f  .      rc = allo
36de0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
36df0 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f  t, &pOvfl, &pgno
36e00 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  Ovfl, pgnoOvfl, 
36e10 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
36e20 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36e30 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
36e40 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70  he database supp
36e50 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d  orts auto-vacuum
36e60 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  , and the second
36e70 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20   or subsequent. 
36e80 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
36e90 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61   page is being a
36ea0 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e  llocated, add an
36eb0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f   entry to the po
36ec0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20  inter-map.      
36ed0 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ** for that page
36ee0 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a   now. .      **.
36ef0 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73        ** If this
36f00 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76   is the first ov
36f10 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65  erflow page, the
36f20 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61  n write a partia
36f30 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a  l entry .      *
36f40 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  * to the pointer
36f50 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74  -map. If we writ
36f60 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69  e nothing to thi
36f70 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c  s pointer-map sl
36f80 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ot,.      ** the
36f90 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63  n the optimistic
36fa0 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20   overflow chain 
36fb0 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c  processing in cl
36fc0 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20  earCell().      
36fd0 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70  ** may misinterp
36fe0 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61  ret the uninitia
36ff0 6c 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64  lized values and
37000 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20   delete the.    
37010 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73    ** wrong pages
37020 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
37030 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  se..      */.   
37040 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
37050 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51  Vacuum && rc==SQ
37060 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37070 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70     u8 eType = (p
37080 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50  gnoPtrmap?PTRMAP
37090 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41  _OVERFLOW2:PTRMA
370a0 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20  P_OVERFLOW1);.  
370b0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28        ptrmapPut(
370c0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
370d0 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
370e0 2c 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20  , &rc);.        
370f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
37100 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
37110 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20  pOvfl);.        
37120 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
37130 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
37140 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
37150 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
37160 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
37170 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
37180 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
37190 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
371a0 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69   than pPrior poi
371b0 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74  nts into the dat
371c0 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20  a area.      ** 
371d0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
371e0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
371f0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
37200 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
37210 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c    assert( pToRel
37220 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  ease==0 || sqlit
37230 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
37240 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70  le(pToRelease->p
37250 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
37260 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69    /* If pPrior i
37270 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
37280 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65  ta area of pPage
37290 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65  , then make sure
372a0 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20   pPage.      ** 
372b0 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
372c0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  le */.      asse
372d0 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65  rt( pPrior<pPage
372e0 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f  ->aData || pPrio
372f0 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  r>=&pPage->aData
37300 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
37310 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
37320 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
37330 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
37340 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
37350 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
37360 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
37370 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
37380 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
37390 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
373a0 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
373b0 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
373c0 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
373d0 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
373e0 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
373f0 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
37400 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
37410 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
37420 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
37430 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
37440 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
37450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
37470 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
37480 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
37490 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
374a0 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
374b0 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
374c0 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
374d0 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
374e0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
374f0 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
37500 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
37510 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
37520 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
37530 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
37540 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
37550 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
37560 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
37570 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
37580 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
37590 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
375a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f  .static void dro
375b0 70 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  pCell(MemPage *p
375c0 50 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69  Page, int idx, i
375d0 6e 74 20 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29  nt sz, int *pRC)
375e0 7b 0a 20 20 75 33 32 20 70 63 3b 20 20 20 20 20  {.  u32 pc;     
375f0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
37600 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66   cell content of
37610 20 63 65 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65   cell being dele
37620 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ted */.  u8 *dat
37630 61 3b 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67  a;       /* pPag
37640 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 75 38  e->aData */.  u8
37650 20 2a 70 74 72 3b 20 20 20 20 20 20 20 20 2f 2a   *ptr;        /*
37660 20 55 73 65 64 20 74 6f 20 6d 6f 76 65 20 62 79   Used to move by
37670 74 65 73 20 61 72 6f 75 6e 64 20 77 69 74 68 69  tes around withi
37680 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
37690 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t rc;         /*
376a0 20 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65   The return code
376b0 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20   */.  int hdr;  
376c0 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69        /* Beginni
376d0 6e 67 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ng of the header
376e0 2e 20 20 30 20 6d 6f 73 74 20 70 61 67 65 73 2e  .  0 most pages.
376f0 20 20 31 30 30 20 70 61 67 65 20 31 20 2a 2f 0a    100 page 1 */.
37700 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
37710 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
37720 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50  idx>=0 && idx<pP
37730 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
37740 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
37750 44 42 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69  DB || sz==cellSi
37760 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
37770 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
37780 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
37790 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
377a0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
377b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
377c0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
377d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
377e0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
377f0 0a 20 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d  .  ptr = &pPage-
37800 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d  >aCellIdx[2*idx]
37810 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79 74  ;.  pc = get2byt
37820 65 28 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20  e(ptr);.  hdr = 
37830 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
37840 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 63  ;.  testcase( pc
37850 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
37860 5b 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65  [hdr+5]) );.  te
37870 73 74 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70  stcase( pc+sz==p
37880 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
37890 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70  eSize );.  if( p
378a0 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42  c+sz > pPage->pB
378b0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  t->usableSize ){
378c0 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49  .    *pRC = SQLI
378d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
378e0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
378f0 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63  .  rc = freeSpac
37900 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
37910 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
37920 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
37930 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
37940 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
37950 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
37960 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  l==0 ){.    mems
37970 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
37980 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61   0, 4);.    data
37990 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20  [hdr+7] = 0;.   
379a0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
379b0 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70  hdr+5], pPage->p
379c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
379d0 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
379e0 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  e = pPage->pBt->
379f0 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61  usableSize - pPa
37a00 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20  ge->hdrOffset.  
37a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68       - pPage->ch
37a30 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a  ildPtrSize - 8;.
37a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
37a50 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c  move(ptr, ptr+2,
37a60 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   2*(pPage->nCell
37a70 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75   - idx));.    pu
37a80 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
37a90 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
37aa0 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  l);.    pPage->n
37ab0 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d  Free += 2;.  }.}
37ac0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
37ad0 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
37ae0 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
37af0 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
37b00 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
37b10 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
37b20 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
37b30 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
37b40 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
37b50 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
37b60 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
37b70 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
37b80 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
37b90 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
37ba0 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
37bb0 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
37bc0 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
37bd0 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
37be0 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
37bf0 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
37c00 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  pOvfl[] and make
37c10 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
37c20 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
37c30 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
37c40 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
37c50 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
37c60 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
37c70 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
37c80 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
37c90 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
37ca0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
37cb0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
37cc0 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
37cd0 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75  d..**.** *pRC mu
37ce0 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20  st be SQLITE_OK 
37cf0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
37d00 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
37d10 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65  static void inse
37d20 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  rtCell(.  MemPag
37d30 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50  e *pPage,   /* P
37d40 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77  age into which w
37d50 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f  e are copying */
37d60 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20  .  int i,       
37d70 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c       /* New cell
37d80 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74   becomes the i-t
37d90 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61  h cell of the pa
37da0 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ge */.  u8 *pCel
37db0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  l,        /* Con
37dc0 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20  tent of the new 
37dd0 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  cell */.  int sz
37de0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
37df0 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20  ytes of content 
37e00 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38  in pCell */.  u8
37e10 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20   *pTemp,        
37e20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
37e30 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c  space for pCell,
37e40 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
37e50 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20  Pgno iChild,    
37e60 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f    /* If non-zero
37e70 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20  , replace first 
37e80 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69  4 bytes with thi
37e90 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  s value */.  int
37ea0 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f   *pRC          /
37eb0 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65  * Read and write
37ec0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   return code fro
37ed0 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  m here */.){.  i
37ee0 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20  nt idx = 0;     
37ef0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
37f00 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
37f10 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
37f20 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
37f30 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
37f40 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61  nter */.  u8 *da
37f50 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
37f60 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
37f70 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
37f80 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20    u8 *pIns;     
37f90 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
37fa0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
37fb0 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63  Idx[] where no c
37fc0 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a  ell inserted */.
37fd0 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d  .  assert( *pRC=
37fe0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
37ff0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
38000 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
38010 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
38020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58   );.  assert( MX
38030 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
38040 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73  )<=10921 );.  as
38050 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
38060 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67  ll<=MX_CELL(pPag
38070 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55  e->pBt) || CORRU
38080 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
38090 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
380a0 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70  low<=ArraySize(p
380b0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b  Page->apOvfl) );
380c0 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
380d0 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76  Size(pPage->apOv
380e0 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70  fl)==ArraySize(p
380f0 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b  Page->aiOvfl) );
38100 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
38110 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
38120 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
38130 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c   );.  /* The cel
38140 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  l should normall
38150 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65  y be sized corre
38160 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20  ctly.  However, 
38170 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20  when moving a.  
38180 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c  ** malformed cel
38190 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61  l from a leaf pa
381a0 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f  ge to an interio
381b0 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63  r page, if the c
381c0 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61  ell size.  ** wa
381d0 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20  nted to be less 
381e0 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72  than 4 but got r
381f0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f  ounded up to 4 o
38200 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e  n the leaf, then
38210 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74   size.  ** might
38220 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20   be less than 8 
38230 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69  (leaf-size + poi
38240 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74  nter) on the int
38250 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e  erior node.  Hen
38260 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d  ce.  ** the term
38270 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e   after the || in
38280 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
38290 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73  ssert(). */.  as
382a0 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d  sert( sz==pPage-
382b0 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
382c0 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d  , pCell) || (sz=
382d0 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20  =8 && iChild>0) 
382e0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
382f0 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
38300 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
38310 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
38320 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
38330 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a  pTemp, pCell, sz
38340 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  );.      pCell =
38350 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20   pTemp;.    }.  
38360 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a    if( iChild ){.
38370 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
38380 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20  Cell, iChild);. 
38390 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61     }.    j = pPa
383a0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b  ge->nOverflow++;
383b0 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73  .    /* Comparis
383c0 6f 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61 79  on against Array
383d0 53 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65 20  Size-1 since we 
383e0 68 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65 78  hold back one ex
383f0 74 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20  tra slot.    ** 
38400 61 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79  as a contingency
38410 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
38420 73 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f  s, never need mo
38430 72 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66 6c  re than 3 overfl
38440 6f 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20  ow.    ** slots 
38450 62 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63 61  but 4 are alloca
38460 74 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65 20  ted, just to be 
38470 73 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  safe. */.    ass
38480 65 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53 69  ert( j < ArraySi
38490 7a 65 28 70 50 61 67 6